2012-10-15 26 views
4

我嘗試:Python列表給出了奇怪的結果

[True,True,False] and [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] 

回答

4

其他人已經解釋了發生了什麼事情。這裏有一些方法來得到你想要的東西:

>>> 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) 
5

任何填充的列表計算爲True。第二個列表True and x產生x

1

[True, True, False]正在評估爲布爾值(因爲and運算符),並且因爲它是非空值而評估爲True。與[True, True, True]相同。任何一條語句的結果都是and運算符後的結果。

對於列表ab,您可以執行類似[ai and bi for ai, bi in zip(a, b)]的操作。

0

and返回最後一個元素,如果它們全部評估爲True

>>> 1 and 2 and 3 
3 

同樣是有效的名單,如果他們不爲空(在你的情況下),這是evalueted到True

0

Python通過短路布爾值來工作,並給出結果表達式作爲結果。 填充列表的計算結果爲true,並將結果作爲第二個列表的值。看看這個,我剛換了你的第一個和第二個列表的位置。

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

Python documentation

表達式x和y首先評估X;如果x爲假,則返回其值;否則,評估y並返回結果值。

你會得到第二個返回值。

P.S.我從來沒有見過這種行爲,我必須自己去查看它。我天真的期望是一個布爾表達式會產生一個布爾結果。

1

據我所知,你需要通過列表壓縮。試試這種列表理解:

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