有没有针对布尔列表的逐元素布尔运算的内置函数?

28
例如,如果您有n个相同长度的布尔列表,则逐元素布尔AND应返回另一个该长度的列表,在该列表中,所有输入列表都为True的位置上具有True,其他位置上为False。
很容易编写代码,但我更喜欢使用内置函数(为了标准化/可读性)。
这是逐元素AND的实现:
def eAnd(*args):
    return [all(tuple) for tuple in zip(*args)]

使用示例:

>>> eAnd([True, False, True, False, True], [True, True, False, False, True], [True, True, False, False, True])
[True, False, False, False, True]
5个回答

23

Python中没有内置的方法来实现这个功能。通常情况下,在Python中使用列表推导式等方式进行逐元素操作。

Numpy提供了此功能(由于技术限制,使用&),可用于其数组类型。Numpy数组通常逐元素执行操作。


21

尝试:

[ x&y for (x,y) in zip(list_a, list_b)]

如果你正在处理非常长的列表,或者你的一些变量是/需要是numpy数组,相应的numpy代码如下:

list( np.array(list_a) & np.array(list_b) )

根据您的需要进行修改。


对我来说,这似乎非常像Python风格,并且您也不必导入NumPy。 - 55651909-089b-4e04-9408-47c5bf
2
如果可能的話,我仍然建議使用numpy,因為它的速度比其他方法快了數個量級,且語法更易於閱讀:arr1&arr2會給出一個包含結果的數組。 - Zak
@Zak:我同意,特别是如果list_a、list_b很长或已经是numpy数组。否则你需要付出转换的代价。 - ntg
2
你也可以使用np.logical_and()。 - user3450049

3
< p >如果您指定要折叠的维度,numpy.all函数会执行您想要的操作:< /p>
>>> all([[True, False, True, False, True], [True, True, False, False, True], [True, True, False, False, True]], 0)
array([ True, False, False, False,  True], dtype=bool)

1
你所提到的 all 函数并不是内置函数,而是 numpy.all - DSM

1

不,没有这样的内置函数。你使用 zipall / any 的方法是我会使用的。


1
不,我不相信标准库中有这样的功能......特别是当可以通过提供的函数轻松编写时。

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