Python列表中的布尔值比较给出了奇怪的结果

时间:2012-10-15 15:22:23

标签: python list comparison boolean

我试试:

[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 个答案:

答案 0 :(得分:5)

任何填充列表的评估结果为TrueTrue and x生成x,第二个列表。

答案 1 :(得分:5)

来自Python documentation

  

表达式x和y首先计算x;如果x为false,则返回其值;否则,评估y并返回结果值。

你得到了第二个值。

P.S。我之前从未见过这种行为,我不得不自己查一下。我天真的期望是布尔表达式会产生一个布尔结果。

答案 2 :(得分:5)

其他人已经解释了发生了什么。以下是获得所需内容的一些方法:

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

使用listcomp:

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

and_功能与map

一起使用
>>> 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)

答案 3 :(得分:1)

[True, True, False]被评估为布尔值(因为and运算符),并且评估为True,因为它是非空的。与[True, True, True]相同。任何一个语句的结果都是and运算符之后的任何结果。

对于列表[ai and bi for ai, bi in zip(a, b)]a,您可以执行b之类的操作。

答案 4 :(得分:1)

据我所知,您需要压缩列表。尝试这种列表理解:

l1 = [True,True,False]
l2 = [True,True,True]
res = [ x and y for (x,y) in zip(l1, l2)]
print res

答案 5 :(得分:0)

and返回最后一个元素,如果它们都被评估为True

>>> 1 and 2 and 3
3

同样适用于列表,如果它们不为空(如您的情况),则会对True进行评估。

答案 6 :(得分:0)

Python的工作原理是将其布尔值短路并将结果表达式作为结果。 填充列表的计算结果为true,并将结果作为第二个列表的值。看看这个,我刚刚交换了你的第一个和第二个列表的位置。

In [3]: [True,True,True] and [True, True, False]
Out[3]: [True, True, False]