Учитывая список и растровую маску, как я могу вернуть значения по индексам, которые верны?
Вопрос
Я начинаю со следующего списка 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']
Решение
Python 3.1. iTertools.compress. (или Python 2.7's Если вы еще не модернизировались) Имеется точно, что (понимание списка является настоящим близким вторым):
import itertools
filtered = itertools.compress(s, b)
Обратите внимание, что это производит итератор, а не список. Сохраняет память, но если вам нужно повторить его несколько раз или использовать индексы, вы всегда можете использовать list(itertools.compress(s, b))
. Отказ Все еще короче.
Другие советы
[ item for item, flag in zip( s, b ) if flag == 1 ]
Вы можете использовать Сообщение списка:
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]]