Я начинаю со следующего списка 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']
9
Kit 24 Авг 2010 в 14:11

4 ответа

Лучший ответ

Python 3.1 itertools.compress (или Python 2.7, если вы еще не обновились), делает именно это (понимание списка является очень близко второе):

import itertools
filtered = itertools.compress(s, b)

Обратите внимание, что это создает итератор, а не список. Экономит память, но если вам нужно повторить ее несколько раз или использовать индексы, вы всегда можете использовать list(itertools.compress(s, b)). Еще короче.

18
Nil Geisweiller 22 Июн 2012 в 14:53

Другой взгляд на понимание списка без использования zip

newList = [item for i, item in enumerate(s) if b[i]]
0
Agostino 7 Дек 2016 в 21:27

Вы можете использовать списочные варианты:

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.

Сначала в нем собраны два исходных списка и zips их вместе, так что вы получите a (временный - это все еще в списке comp!) список пар слов и их масок - что-то вроде [('baa',1), ('baa',0),...]. Затем к newList добавляются только слова с маской 1 (if mask == 1).

8
Stephen 24 Авг 2010 в 10:39
[ item for item, flag in zip( s, b ) if flag == 1 ]
10
S.Lott 24 Авг 2010 в 10:12