5

我尝试:

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

并得到 [True, True True]

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

[True,True,False]

不太清楚为什么它会给出这些奇怪的结果,即使在查看了其他一些 python 布尔比较问题之后也是如此。Integer 做同样的事情(替换上面的 True -> 1 和 False ->0 并且结果是一样的)。我错过了什么?我显然想要

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

评价为

[True,True,False]
4

7 回答 7

7

其他人已经解释了发生了什么。这里有一些方法可以得到你想要的:

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

使用 listcomp:

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

and_函数与 a 一起使用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)
于 2012-10-15T15:33:36.563 回答
5

任何填充列表的计算结果为TrueTrue and x产生x,第二个列表。

于 2012-10-15T15:26:18.217 回答
5

Python 文档

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

您将返回第二个值。

PS我以前也从未见过这种行为,我必须自己查一下。我天真的期望是布尔表达式会产生布尔结果。

于 2012-10-15T15:29:57.767 回答
1

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

您可以[ai and bi for ai, bi in zip(a, b)]为列表ab.

于 2012-10-15T15:27:35.267 回答
1

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

>>> 1 and 2 and 3
3

这同样适用于列表,True如果它们不为空(如您的情况),则将其评估为。

于 2012-10-15T15:28:34.860 回答
1

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

l1 = [True,True,False]
l2 = [True,True,True]
res = [ x and y for (x,y) in zip(l1, l2)]
print res
于 2012-10-15T15:33:18.260 回答
0

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

In [3]: [True,True,True] and [True, True, False]
Out[3]: [True, True, False]
于 2012-10-15T15:29:57.140 回答