我试试:
[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]
答案 0 :(得分:5)
任何填充列表的评估结果为True
。 True and x
生成x
,第二个列表。
答案 1 :(得分:5)
表达式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)
答案 6 :(得分:0)
Python的工作原理是将其布尔值短路并将结果表达式作为结果。 填充列表的计算结果为true,并将结果作为第二个列表的值。看看这个,我刚刚交换了你的第一个和第二个列表的位置。
In [3]: [True,True,True] and [True, True, False]
Out[3]: [True, True, False]