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

2024-06-11 20:14:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我从下面的列表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']

Tags: or函数you列表havewithanyiterable
3条回答

您可以使用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),...]。然后只有掩码为1(if mask == 1)的单词被添加到newList

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 ]

相关问题 更多 >