2012-05-23 15 views

Antwort

7

diese stattdessen versuchen, funktioniert es für Listen jeder Größe:

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

Beachten Sie, dass Ihre vorgeschlagene Lösung reduce mit funktioniert nicht für mehr als zwei Artikel , da der akkumulierte Wert nach dem ersten Vergleich True ist und Sie True mit jedem der Elemente von diesem Punkt an vergleichen würden, und offensichtlich wird das nicht funktionieren.

+0

sicher. tatsächlich mache ich das einfachere 'a [1:] == a [: - 1]' es funktioniert, aber meine Frage ist, warum 'reduzieren' unerwartete Ergebnisse erzeugt, wie in meiner Frage gezeigt? – Jack

+1

@Jack nein, das machst du nicht. Siehe meine bearbeitete Antwort. –

+0

Es funktioniert auch für leere Listen. –

2

Sie sind nicht die Listen zu reduzieren. Der Rückgabewert Ihres Lambdas ist True oder False, der dann als Eingangsparameter für weitere Aufrufe derselben Lambda-Funktion verwendet wird. Sie vergleichen also einen Booleschen Wert mit einer Liste. Daher sollte die reduzierende Funktion denselben Typ wie die Eingabeparameter zurückgeben.

Sie waren wahrscheinlich auf der Suche nach anderen Antworten stattdessen vorgeschlagen: Verwenden Sie all().

1

Weil zum ersten Mal reduzieren vergleichen [1,2,3] == [1, 2, 3] und es ist wahr nächste Mal es True und [1,2,3] vergleichen und es ist falsch.

Hilfe (reduzieren)

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) die reduce Funktion die Funktion operator.eq auf der Tanne bewerten zuerst zu bewerten st zwei Elemente von a zu erhalten True. Dann wird es operator.eq erneut mit True und range(1, 4) als die beiden Argumente aufrufen und False erhalten, was das Endergebnis von reduce ist.

Vielleicht Sie wollen:

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

Warum im zweiten Fall, das Ergebnis falsch ist

Da reduce(lambda x, y: x == y, (a, b, c, d)) nicht (a == b) and (b == c) and (c == d) bedeutet; es bedeutet (((a == b) == c) == d). a == b erzeugt entweder True oder False, was dann mit c verglichen wird.

Verwandte Themen