python reduce um zu prüfen, ob alle Elemente gleich sind

8

Angenommen a = [[1,2,3],[1,2,3]] reduce(lambda x,y: x==y, a) gibt True

zurück

Aber wenn a = [[1,2,3],[1,2,3],[1,2,3]] reduce(lambda x,y: x==y, a) gibt False

zurück

Warum im zweiten Fall ist das Ergebnis False ?

bitte helfen

Danke

    
Jack 23.05.2012, 00:27
quelle

5 Antworten

7

Versuchen Sie es stattdessen, es funktioniert für Listen jeder Größe:

%Vor%

Beachten Sie, dass Ihre vorgeschlagene Lösung mit reduce nicht für mehr als zwei Elemente funktioniert, da der kumulierte Wert nach dem ersten Vergleich True ist und Sie True mit jedem der Elemente aus vergleichen dieser Punkt, und offensichtlich wird das nicht funktionieren.

    
Óscar López 23.05.2012 00:34
quelle
2

Sie reduzieren die Listen nicht . 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 haben wahrscheinlich nach anderen Antworten gesucht: Verwenden Sie all() .

    
C2H5OH 23.05.2012 00:35
quelle
1

Weil das erste Mal reduziert Vergleich [1,2,3] == [1, 2, 3] und es ist wahr nächstes Mal, wenn es Wahr und [1,2,3] vergleicht und es falsch ist.

  
    
      

Hilfe (reduzieren)

    
  
%Vor%     
ddzialak 23.05.2012 00:37
quelle
1

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

Um reduce(operator.eq, a) auszuwerten, wird die Funktion reduce zuerst die Funktion operator.eq auf den ersten beiden Elementen von a auswerten, um True zu erhalten. Dann wird% code_% erneut mit operator.eq und True als die beiden Argumente aufgerufen und range(1, 4) erhalten, was das Endergebnis von False ist.

Vielleicht wollen Sie:

%Vor%     
wberry 23.05.2012 00:40
quelle
0
  

Warum im zweiten Fall ist das Ergebnis falsch

Weil 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.

    
Karl Knechtel 23.05.2012 00:54
quelle

Tags und Links