Список фильтров с использованием булевых индексных массивов

Как я могу использовать логические массивы inddex для фильтрации списка без использования numpy?

Например:

>>> l = ['a','b','c'] >>> b = [True,False,False] >>> l[b] 

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

 ['a'] 

Я знаю, что numpy поддерживает его, но хочу знать, как решить проблему на Python.

 >>> import numpy as np >>> l = np.array(['a','b','c']) >>> b = np.array([True,False,False]) >>> l[b] array(['a'], dtype='|S1') 

Python не поддерживает логическое индексирование, но функция itertools.compress выполняет именно то, что вы хотите. Он возвращает итератор со средствами, которые необходимо использовать конструктор list для возврата списка.

 >>> from itertools import compress >>> l = ['a', 'b', 'c'] >>> b = [True, False, False] >>> list(compress(l, b)) ['a'] 
 [a for a, t in zip(l, b) if t] # => ["a"] 

Немного эффективнее, используйте версию итератора:

 from itertools import izip [a for a, t in izip(l, b) if t] # => ["a"] 

EDIT: версия user3100115 лучше.