Учитывая список и битовую маску, как я могу возвратить значения в индексах, которые являются Истиной?
Я начинаю со следующего списка s
и битовая маска b
:
s = ['baa', 'baa', 'black', 'sheep', 'have', 'you', 'any', 'wool']
b = [1, 0, 0, 0, 1, 1, 1, 0] # or any iterable with boolean values
Как мне написать какую-то функцию apply_bitmask(s, b)
так что это возвращает
['baa', 'have', 'you', 'any']
4 ответа
Python 3.1 itertools.compress (или Python 2.7, если вы еще не обновились) делает именно это (понимание списка очень близко):
import itertools
filtered = itertools.compress(s, b)
Обратите внимание, что это создает итератор, а не список. Экономит память, но если вам нужно повторить ее несколько раз или использовать индексы, вы всегда можете использовать list(itertools.compress(s, b))
, Еще короче.
Вы можете использовать списки:
newList = [word for (word, mask) in zip(s,b) if mask]
# Note: Could also use 'if mask == blah', if mask is not a boolean-compatible type.
Сначала он берет два исходных списка и объединяет их в архив, так что вы получаете (временный - он все еще находится в списке comp!) Список пар слов и их масок - что-то вроде [('baa',1), ('baa',0),...]
, Тогда только слова, которые имеют маску 1 (if mask == 1
) добавляются в newList
,
Другой взгляд на понимание списка без использования zip
newList = [item for i, item in enumerate(s) if b[i]]