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

时间:2017-11-21 17:40:04

标签: 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]

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

7 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

这是正常的,因为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

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

答案 2 :(得分:3)

您的列表没有比较每个单独的值,他们正在比较列表中值的存在。

对于任何真实变量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.

答案 3 :(得分:3)

我认为你需要这样的东西:

.eq-height {
  display: flex;
  justify-content: space-between;
  align-items: stretch;
}

.eq-height > div {
  flex-grow: 1;
  border: 1px solid #ccc;
  text-align: center;
  padding: 1em;
}

答案 4 :(得分:3)

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

andor都返回决定操作值的操作数。

如果and的左侧是真实的,那么它必须评估右侧,因为它可能是假的,这会使整个操作变为假(假and任何事都是假的)。因此,它返回右侧。

如果or的左侧是真实的,则不需要评估右侧,因为它已经知道表达式为真(真or任何事都是真的)。所以它返回左侧。

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

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

答案 5 :(得分:1)

非常方便的方式:

>>> 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)

答案 6 :(得分:1)

具有功能性:

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]