根据另一个列表中的 True/False 过滤列表中的元素

at.*_*at. 4 python list python-3.x masked-array

在 vanilla Python 3 中是否有一种惯用的方法来屏蔽数组的元素?例如:

a = [True, False, True, False]
b = [2, 3, 5, 7]
b[a]
Run Code Online (Sandbox Code Playgroud)

我希望b[a]能返回[2, 5],但出现错误:

类型错误:列表索引必须是整数或切片,而不是列表

在 R 中,这按我的预期工作(使用c()而不是[]创建列表)。我知道 NumPyMaskedArray可以做到这一点,我正在寻找一种惯用的方法来用普通的 Python 来做到这一点。当然,我可以使用循环并迭代掩码列表和元素列表,但我希望有一种更有效的方法来使用更高级别的抽象来掩码元素。

Moi*_*dri 6

您可以使用itertools.compress

>>> from itertools import compress
>>> a = [True, False, True, False]
>>> b = [2, 3, 5, 7]


>>> list(compress(b, a))
[2, 5]
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅“itertools.compress()”文档