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

Yoh*_*dia 11 python list logical-operators

我得到一个奇怪的结果,我尝试将andor运算符应用于python中的2个布尔列表.我实际上得到了与我期望的完全相反的东西.

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

[True, False, False] or [True, True, False]
> [True, False, False]
Run Code Online (Sandbox Code Playgroud)

这是正常的,如果是的话,为什么?

jas*_*per 10

如果您真正想要的是两个列表之间的元素方式布尔运算,请考虑使用该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)
Run Code Online (Sandbox Code Playgroud)


Pat*_*ugh 6

这是正常的,因为andor实际评价他们的一个操作数。x and y就好像

def and(x, y):
    if x:
        return y
    return x
Run Code Online (Sandbox Code Playgroud)

虽然x or y就像

def or(x, y):
    if x:
        return x
    return y
Run Code Online (Sandbox Code Playgroud)

由于两个列表都包含值,因此它们都是“真实的”,因此and求值为第二个操作数,而or求值为第一个。


Dav*_*ica 2

您的列表不是比较每个单独的值,而是比较列表中值的存在情况。

对于任何真实变量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.
Run Code Online (Sandbox Code Playgroud)

现在,真实性取决于类型。例如,整数对于 为真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.
Run Code Online (Sandbox Code Playgroud)