2013-07-10 86 views
3

我一直在尋找所有,但無法找出這件事。列表理解返回錯誤結果

我來自Java的背景,如果有幫助,試圖學習python。

a = [ 
    (i,j,k) for (i,j,k) in [ 
     (i,j,k) for i in {-4,-2,1,2,5,0} 
        for j in {-4,-2,1,2,5,0} 
          for k in {-4,-2,1,2,5,0} if (i+j+k > 0 & (i!=0 & j!=0 & k!=0)) 
     ] 
] 

語句是:得到所有的總和爲零的元組,但是它們都不應該有0。這個結果總是由所有元組組成。 。:(

+2

外部理解的原因是什麼?它實際上並沒有做任何有用的事情,但你必須有寫作的理由。 – user2357112

+0

真的,我第一次嘗試沒有它..但它仍然沒有工作..因此,我看到它是否適用於它.. – abhididdigi

回答

9

您使用了錯誤的操作你想boolean and; & is a bitwise operator

[(i,j,k) for (i,j,k) in [(i,j,k) for i in {-4,-2,1,2,5,0} for j in {-4,-2,1,2,5,0} for k in {-4,-2,1,2,5,0} if (i+j+k > 0 and (i!=0 and j!=0 and k!=0)) ] ] 

你可以消除嵌套列表理解,它是多餘的:

[(i,j,k) for i in {-4,-2,1,2,5,0} for j in {-4,-2,1,2,5,0} for k in {-4,-2,1,2,5,0} if (i+j+k > 0 and (i!=0 and j!=0 and k!=0))] 

接下來,使用itertools.product() function至g enerate所有的組合,而不是嵌套循環,並all()測試,如果所有的值不爲零:

from itertools import product 
[t for t in product({-4,-2,1,2,5,0}, repeat=3) if sum(t) > 0 and all(t)] 

,但你可能也忽略自定0並保存自己的all()測試:

from itertools import product 
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) > 0] 

,也許你想糾正測試等於 0:

from itertools import product 
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) == 0] 

結果:

>>> [t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) == 0] 
[(1, 1, -2), (1, -2, 1), (2, 2, -4), (2, -4, 2), (-4, 2, 2), (-2, 1, 1)] 
+0

謝謝,我曾嘗試使用&&但現在我知道我應該使用過,並且 – abhididdigi

9

在蟒蛇,&有點符對於你的需要,你應使用and

+0

此外,不同的優先順序是一個大問題。 – glglgl

1

其他人正在解決錯誤的問題。 是的, and是合乎邏輯的,而 &是按位進行的,但由於操作數是布爾值,所以它實際上不會影響您的代碼。 哎呦;這實際上會影響你的代碼,因爲優先級是不同的。除此之外,雖然,你有一個錯字:

i+j+k > 0 

應該

i + j + k == 0 

,如果你想其總和爲0

+0

是的,謝謝你的幫助改變了它 - 我的問題其實是圍繞着運營商.. – abhididdigi

1

使用itertools.product和sum()元組:

from itertools import product 

list1 = (-4,-2,1,2,5,0) 
list2 = (-4,-2,1,2,5,0) 

print [ couple for couple in product(list1, list2) if not sum(couple) ] 
+0

速度不夠快,可以使用重複itertools.product的參數,如@Martijn所示 – geertjanvdk

3

正如其他人已經說過的,你使用了錯誤的操作符。

這本不會是一個問題,因爲你只能結合(或者說,試圖合併)布爾值。

&and運營商有不同precedence

(i+j+k > 0 and (i!=0 and j!=0 and k!=0)) 

將是正確的,因爲and>!=更高的優先級。

然而,

(i+j+k > 0 & (i!=0 & j!=0 & k!=0)) 

原來是

(i+j+k > (0 & (i != (0 & j) != (0 & k) !=0))) 

這使得右手評估爲0,並表達i + j + k > 0似乎幾乎所有的數據是真實的。

+0

感謝您花時間解釋這種差異。 – abhididdigi