Python布尔列表比较产生奇怪的结果

5
我会尝试:
[True,True,False] and [True,True,True]

并获得 [True, True, True]。

但是

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

提供

[True,True,False]

不太确定为什么即使在查看了其他Python布尔比较问题后,它仍然给出那些奇怪的结果。整数也是一样的(将上面的True替换为1,False替换为0,结果是相同的)。我缺少什么?显然我想要

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

评估为
[True,True,False]
7个回答

8

其他人已经解释了正在发生的事情。以下是一些获取你想要内容的方法:

>>> a = [True, True, True]
>>> b = [True, True, False]

使用列表推导式:

>>> [ai and bi for ai,bi in zip(a,b)]
[True, True, False]

使用 mapand_ 函数:
>>> from operator import and_
>>> map(and_, a, b)
[True, True, False]

或者我更喜欢的方法(尽管这需要 numpy):

>>> from numpy import array
>>> a = array([True, True, True])
>>> b = array([True, True, False])
>>> a & b
array([ True,  True, False], dtype=bool)
>>> a | b
array([ True,  True,  True], dtype=bool)
>>> a ^ b
array([False, False,  True], dtype=bool)

5

任何非空列表都为 TrueTrue and x 返回第二个列表x


5
Python文档中得知:
表达式 x and y 首先计算 x;如果 x 是 false,则返回其值;否则,计算 y 并返回该值。
你获得了第二个返回值。
附言:我之前也从未见过这种行为,不得不自己查阅资料。我的天真期望是布尔表达式会产生布尔结果。

1

and 如果所有元素都被评估为 True,则返回最后一个元素。

>>> 1 and 2 and 3
3

同样适用于列表,如果它们不为空(就像您的情况一样),则会被评估为True

1
据我所知,您需要快速浏览列表。尝试使用类似于以下的列表推导式:
l1 = [True,True,False]
l2 = [True,True,True]
res = [ x and y for (x,y) in zip(l1, l2)]
print res

1

[True, True, False]正在被评估为布尔值(因为使用了and运算符),并且由于它是非空的,所以评估结果为True。对于[True, True, True]也是一样。任何一个语句的结果都只是and运算符后面的内容。

你可以像这样做:[ai and bi for ai, bi in zip(a, b)],其中ab是列表。


0
Python的工作方式是通过短路布尔运算并将结果表达式作为结果返回。填充的列表求值为真,并将第二个列表的值作为结果返回。看看这个例子,当我只是交换了你的第一个和第二个列表的位置。
In [3]: [True,True,True] and [True, True, False]
Out[3]: [True, True, False]

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