2024-06-11 20:14:42 发布
网友
我从下面的列表s和位掩码b开始:
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),以便它返回
apply_bitmask(s, b)
['baa', 'have', 'you', 'any']
您可以使用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。
[('baa',1), ('baa',0),...]
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))。再短一点。
list(itertools.compress(s, b))
[ item for item, flag in zip( s, b ) if flag == 1 ]
您可以使用list comprehensions:
这首先获取原始的两个列表,然后zips将它们放在一起,这样您就得到一个(临时的-这仍然在列表comp中!)单词对及其掩码的列表-类似于
[('baa',1), ('baa',0),...]
。然后只有掩码为1(if mask == 1
)的单词被添加到newList
。Python 3.1 itertools.compress(或者Python 2.7's如果您还没有升级)确实做到了这一点(列表理解是非常接近的一秒):
注意,这会生成一个迭代器,而不是一个列表。节省内存,但如果需要多次迭代或使用索引,则始终可以使用
list(itertools.compress(s, b))
。再短一点。相关问题 更多 >
编程相关推荐