我从以下列表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 ]
... if mask
,因为他问的是真值,而不是特定的 1
。 - user395760另一种使用列表推导式的方法,不使用zip函数。
newList = [item for i, item in enumerate(s) if b[i]]
result = (i for i, flag in itertools.izip(s, b) if flag)
(在Python 3中的zip是Python 2中的izip,它是一个惰性迭代器而不是列表))时才有效。 - user395760