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

hik*_*ker 4 python arrays list python-3.x

如何在不使用numpy的情况下使用boolean inddex数组过滤列表?

例如:

>>> l = ['a','b','c']
>>> b = [True,False,False]
>>> l[b]
Run Code Online (Sandbox Code Playgroud)

结果应该是:

['a']
Run Code Online (Sandbox Code Playgroud)

我知道numpy支持它,但想知道如何用Python解决.

>>> import numpy as np
>>> l = np.array(['a','b','c'])
>>> b = np.array([True,False,False])
>>> l[b]
array(['a'], 
      dtype='|S1')
Run Code Online (Sandbox Code Playgroud)

sty*_*ane 7

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

>>> from itertools import compress
>>> l = ['a', 'b', 'c']
>>> b = [True, False, False]
>>> list(compress(l, b))
['a']
Run Code Online (Sandbox Code Playgroud)


Ama*_*dan 5

[a for a, t in zip(l, b) if t]
# => ["a"]
Run Code Online (Sandbox Code Playgroud)

更高效一点,使用迭代器版本:

from itertools import izip
[a for a, t in izip(l, b) if t]
# => ["a"]
Run Code Online (Sandbox Code Playgroud)

编辑:user3100115 的版本更好。