给定列表和一个bitmask,我如何在真实的索引上返回值?
题
我从以下列表开始 s
和bitmask 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 如果您尚未升级)确实可以做到这一点(列表理解是真正的关闭第二):
import itertools
filtered = itertools.compress(s, b)
请注意,这会产生迭代器,而不是列表。保存内存,但是如果您需要迭代多次或使用索引,则可以始终使用 list(itertools.compress(s, b))
. 。仍然短。
其他提示
[ item for item, flag in zip( s, b ) if flag == 1 ]
另一个对列表理解的看法,使用zip witout
newList = [item for i, item in enumerate(s) if b[i]]
不隶属于 StackOverflow