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

Как я могу использовать логические массивы 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') 

2 Solutions collect form web for “Список фильтров с использованием булевых индексных массивов”

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 лучше.

  • Бесконечное целое число в Python
  • Назначение переменных из входов в цикле FOR в python
  • модуль декоратора против functools.wraps
  • Реализация асинхронного итератора
  • Учебник для Python. Должен ли я использовать 2.x или 3.0?
  • Python - NumPy - удаление нескольких строк и столбцов из массива
  • Будет ли setuptools работать с python 3.2.x
  • TypeError: worker () принимает 0 позиционных аргументов, но 1 дано
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.