给定一个列表和一个位掩码,如何返回True为真的索引值?

Kit*_*Kit 8 python tuples list bitmask sequence

我从以下列表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
Run Code Online (Sandbox Code Playgroud)

如何编写一些函数apply_bitmask(s, b)以便返回

['baa', 'have', 'you', 'any']
Run Code Online (Sandbox Code Playgroud)

小智 18

Python 3.1 itertools.compress(如果你还没有升级,则是Python 2.7)就是这样做的(列表理解是一个非常接近的第二个):

import itertools
filtered = itertools.compress(s, b)
Run Code Online (Sandbox Code Playgroud)

请注意,这会生成迭代器,而不是列表.保存内存,但如果需要多次迭代或使用索引,则可以随时使用list(itertools.compress(s, b)).还是更短.


S.L*_*ott 10

[ item for item, flag in zip( s, b ) if flag == 1 ]
Run Code Online (Sandbox Code Playgroud)


Ste*_*hen 8

您可以使用列表推导:

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.
Run Code Online (Sandbox Code Playgroud)

这首先是原始的两个列表,然后将它们拉到一起,这样你就可以得到一个(临时的 - 这仍然在列表中!)一对单词和它们的掩码列表 - 就像这样[('baa',1), ('baa',0),...].然后只有掩码为1(if mask == 1)的单词被添加到newList.