我得到一个奇怪的结果,我尝试将and
或or
运算符应用于python中的2个布尔列表。实际上,我得到了与我期望的完全相反的东西。
[True, False, False] and [True, True, False]
> [True, True, False]
[True, False, False] or [True, True, False]
> [True, False, False]
这是正常的,如果是,为什么?
答案 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)
这是正常的,因为and
和or
实际上会评估其中一个操作数。 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)
您的列表没有比较每个单独的值,他们正在比较列表中值的存在。
对于任何真实变量a
和b
:
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)
这两个列表都是真实的,因为它们不是空的。
and
和or
都返回决定操作值的操作数。
如果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]