使用布尔索引数组过滤列表

6

如何在不使用numpy的情况下使用布尔索引数组来过滤列表?

例如:

>>> l = ['a','b','c']
>>> b = [True,False,False]
>>> l[b]

结果应该是:
['a']

我知道numpy支持此功能,但想知道如何在Python中解决。
>>> import numpy as np
>>> l = np.array(['a','b','c'])
>>> b = np.array([True,False,False])
>>> l[b]
array(['a'], 
      dtype='|S1')
3个回答

11

Python不支持布尔索引,但itertools.compress函数可以实现你想要的功能。它返回一个迭代器,这意味着你需要使用list构造函数来返回一个列表。

>>> from itertools import compress
>>> l = ['a', 'b', 'c']
>>> b = [True, False, False]
>>> list(compress(l, b))
['a']

5
[a for a, t in zip(l, b) if t]
# => ["a"]

稍微更高效一些,使用迭代器版本:
from itertools import izip
[a for a, t in izip(l, b) if t]
# => ["a"]

编辑:user3100115的版本更好。


1
使用enumerate
l = ['a','b','c']
b = [True,False,False]

res = [item for i, item in enumerate(l) if b[i]]

print(res)

提供

['a']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接