Given a list and a bitmask, how do I return the values at the indices that are True?

最后都变了- 提交于 2020-02-21 10:57:21

问题


I start with the following list s and 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

How do I write some function apply_bitmask(s, b) so that it returns

['baa', 'have', 'you', 'any']

回答1:


Python 3.1 itertools.compress (or Python 2.7's if you haven't upgraded yet) does exactly that (the list comprehension is a real close second):

import itertools
filtered = itertools.compress(s, b)

Note that this produces an iterator, not a list. Saves memory, but if you need to iterate it several times or use indices, you can always use list(itertools.compress(s, b)). Still shorter.




回答2:


[ item for item, flag in zip( s, b ) if flag == 1 ]



回答3:


You can use 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.

This first takes the original two lists, and zips them together, so that you get a (temporary - this is still inside the list comp!) list of pairs of words and their masks - something like [('baa',1), ('baa',0),...]. Then only the words that have a mask of 1 (if mask == 1) are added to the newList.




回答4:


Another take on list comprehension, witout using zip

newList = [item for i, item in enumerate(s) if b[i]]


来源:https://stackoverflow.com/questions/3555375/given-a-list-and-a-bitmask-how-do-i-return-the-values-at-the-indices-that-are-t

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!