两个布尔列表之间的逻辑运算

Logical operation between two Boolean lists

我得到一个奇怪的结果,我尝试将 andor 运算符应用于 python 中的 2 个布尔列表。我得到的结果与我的预期完全相反。

[True, False, False] and [True, True, False]
> [True, True, False]

[True, False, False] or [True, True, False]
> [True, False, False]

这正常吗?如果正常,为什么?

您的列表不会比较每个单独的值,它们会比较列表中是否存在值。

对于任何真实变量 ab:

a and b
> b #The program evaluates a, a is truthy, it evaluates b, b is truthy, so it returns the last evaluated value, b.
a or b
> a #The program evaluates a, a is truthy, so the or statement is true, so it returns the last evaluated value, a.

现在,truthy 取决于类型。例如,整数对于 my_int != 0 是真值,对于 my_int == 0 是假值。所以如果你有:

a = 0
b = 1
a or b
> b #The program evaluates a, a is falsy, so the or statement goes on to evaluate b, b is truthy, so the or statement is true and it returns the last evaluated value b.

我想你需要这样的东西:

[x and y for x, y in zip([True, False, False], [True, True, False])]

这是正常的,因为 andor 实际上求值为它们的操作数之一。 x and y 就像

def and(x, y):
    if x:
        return y
    return x

x or y 就像

def or(x, y):
    if x:
        return x
    return y

由于您的两个列表都包含值,因此它们都是 ,因此 and 计算为第二个操作数,or 计算为第一个。

两个列表都是真实的,因为它们都是非空的。

andor return 决定操作值的操作数。

如果and的左边是真值,那么它必须计算右边的值,因为它可能是假的,这会使整个操作为假(假and任何东西都是假的) .因此,它 return 是右侧。

如果or的左边为真,则不需要计算右边,因为它已经知道表达式为真(真or任何东西都为真)。所以它 return 是左边。

如果您希望对列表中的项目进行成对比较,请使用列表理解,例如:

[x or y for (x, y) in zip(a, b)]     # a and b are your lists

如果您真正想要的是两个列表之间的逐元素布尔运算,请考虑使用 numpy 模块:

>>> import numpy as np
>>> a = np.array([True, False, False])
>>> b = np.array([True, True, False])
>>> a & b
array([ True, False, False], dtype=bool)
>>> a | b
array([ True,  True, False], dtype=bool)

非常方便的方式:

>>> import numpy as np
>>> np.logical_and([True, False, False], [True, True, False])
array([ True, False, False], dtype=bool)
>>> np.logical_or([True, False, False], [True, True, False])
array([ True,  True, False], dtype=bool)

更多功能:

from operator import or_, and_
from itertools import starmap

a = [True, False, False]
b = [True, True, False]
starmap(or_, zip(a,b))  # [True, True, False]
starmap(and_, zip(a,b))  # [True, False, False]