使用布尔索引数组筛选列表

时间:2015-06-15 05:18:44

标签: python arrays list python-3.x

如何使用boolean inddex数组过滤列表而不使用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 个答案:

答案 0 :(得分:6)

Python不支持布尔索引,但itertools.compress函数完全符合您的要求。它返回一个迭代器,意味着你需要使用list构造函数来返回一个列表。

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

答案 1 :(得分:2)

[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的版本更好。

答案 2 :(得分:1)

使用 enumerate

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

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

print(res)

给予

['a']