我从以下列表开始 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 ]

您可以使用 列出综合:

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.

这首先获取最初的两个列表,并且 拉链 他们在一起,以便您得到一个(临时 - 这仍然在列表中!)单词及其面具的列表 - 类似 [('baa',1), ('baa',0),...]. 。然后只有1个掩码的单词(if mask == 1)添加到 newList.

另一个对列表理解的看法,使用zip witout

newList = [item for i, item in enumerate(s) if b[i]]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top