2010-08-24 1 views
8

я начинаю со следующим списком s и Bitmask b:Учитывая список и битовую маску, как мне вернуть значения по индексам True?

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'] 

ответ

17

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

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

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

+0

Ничего себе, это впечатляет. Приветствия для этого дельнана - никогда не знали об этом. – Stephen

+0

@ Stephen: Itertools действительно впечатляет - не только он ставит итераторы на стероиды (как полагают Dive Into Python 3), многие из них могут быть определены менее чем в 5 строках. Почти чувствует себя как Haskell: D – delnan

+0

Могу ли я использовать это с '2.6.5'? – Kit

10
[ item for item, flag in zip(s, b) if flag == 1 ] 
8

Вы можете использовать list comprehensions:

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 их вместе, так что вы получаете список (временные - это все еще в списке comp!) Список пар слов и их масок - что-то вроде [('baa',1), ('baa',0),...]. Затем к newList добавляются только слова, содержащие маску 1 (if mask == 1).

+0

Хотя я бы использовать '... если mask', так как он спросил об истинных ценностях, а не о' 1' специально. – delnan

+0

Это правда. Я добавлю это к ответу. Спасибо, дельнан. – Stephen

0

Другой взять на список понимания, witout используя почтовый

newList = [item for i, item in enumerate(s) if b[i]] 

 Смежные вопросы

  • Нет связанных вопросов^_^