2017-01-20 2 views
0

У меня есть два списка одинаковой длины. Первый содержит строки. Второй - строки, которые могут быть либо 'True', либо 'False'.Элементы выбора списка на основе другого списка 'True'/'False'

Если n-й элемент второго списка равен 'True', я хочу добавить n-й элемент первого списка в другой список.

Так что, если у меня есть:

List1:

('sth1','sth2','sth3','sth4') 

List2:

('True','False','True','False')

Результат должен быть List3:

('sth1','sth3').

Как я могу пересечь два списка таким образом?

+1

FWIW, это было бы чище, если 'List2' содержатся логические значения языка Python 'False' и' True', а не строки. –

+0

Возможный дубликат [Фильтрация списка на основе списка логических элементов] (http://stackoverflow.com/questions/18665873/filtering-a-list-based-on-a-list-of-booleans) (при условии, что эти строки действительно булевы) –

ответ

7

Использование почтового индекса:

result = [x for x, y in zip(xs, ys) if y == 'True'] 

Пример:

xs = ('sth1','sth2','sth3','sth4') 
ys = ('True','False','True','False') 
result = [x for x, y in zip(xs, ys) if y == 'True'] 
result 
['sth1', 'sth3'] 
2

Или используйте NumPy:

import numpy as np 
filtered = np.array(List1)[np.array(List2)] 

КСТАТИ это работает только, если элементы внутри List2 являются True/False, а не если они «True»/«False».

1

Если вы не знаете о zip:

l1 = ('sth1','sth2','sth3','sth4') 
l2 = ('True','False','True','False') 
l = [x for i,x in enumerate(l1) if l2[i]=='True'] 
print l 
#=> ['sth1', 'sth3'] 

Было бы короче с кортежем булевы:

l1 = ('sth1','sth2','sth3','sth4') 
l2 = (True,False,True,False) 

l = [x for i,x in enumerate(l1) if l2[i]] 
print l 
Смежные вопросы