2012-05-23 38 views

回答

7

試試這個,它適用於任何規模的名單:你提出的解決方案使用reduce兩個以上的項目不起作用

all(e == a[0] for e in a) 

公告,因爲第一次比較後的累計值是True,您將比較True與此時的每個元素,顯然這不起作用。

+0

當然。其實我正在做簡單的'a [1:] == a [: - 1]'它的工作原理,但我的問題是爲什麼'reduce'會產生意外的結果,如我的問題所示? – Jack

+1

@傑克不,這不是你在做什麼。看到我編輯的答案。 –

+0

它也適用於空列表。 –

2

你是不是減少列表。您的lambda的返回值是TrueFalse,然後將其用作輸入參數以進一步調用相同的lambda函數。所以你最終將一個布爾值與一個列表進行比較。因此,縮減功能應該返回與輸入參數相同的類型。

您可能正在尋找其他答案,而不是使用:使用all()

1

由於第一次減少比較[1,2,3] == [1,2,3],並且下一次它比較真和[1,2,3]並且它是假的。

幫助(減少)

Help on built-in function reduce in module __builtin__: 

reduce(...) 
    reduce(function, sequence[, initial]) -> value 

    Apply a function of two arguments cumulatively to the items of a sequence, 
    from left to right, so as to reduce the sequence to a single value. 
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates 
    ((((1+2)+3)+4)+5). 
1

a = [range(1, 4), range(1, 4), range(1, 4)]

評價reduce(operator.eq, a)reduce功能將首先對FIR評估功能operator.eq st a的兩個元素獲得True。然後再以Truerange(1, 4)作爲兩個參數再次調用operator.eq,得到False,這是reduce的最終結果。

也許你是想:

from functools import partial 
import operator 
allequal = reduce(partial(operator.eq, a[0]), a[1:]) 
0

爲什麼在第二種情況下,結果是假

因爲reduce(lambda x, y: x == y, (a, b, c, d))並不意味着(a == b) and (b == c) and (c == d);這意味着(((a == b) == c) == d)a == b將產生TrueFalse,然後將其與c比較。

相關問題