567 Stimmen

Prüfen, ob alle Elemente in einer Liste identisch sind

Ich brauche eine Funktion, die eine list und Ausgänge True wenn alle Elemente der Eingabeliste mit dem Standard-Gleichheitsoperator als gleich bewertet werden und False sonst.

Ich denke, es wäre am besten, durch die Liste zu iterieren und benachbarte Elemente zu vergleichen und dann AND alle daraus resultierenden booleschen Werte. Aber ich bin mir nicht sicher, wie man das am besten mit Python machen kann.

12voto

Jerub Punkte 40038

Dies ist eine einfache Methode:

result = mylist and all(mylist[0] == elem for elem in mylist)

Dies ist etwas komplizierter und verursacht einen Overhead für Funktionsaufrufe, aber die Semantik ist klarer formuliert:

def all_identical(seq):
    if not seq:
        # empty list is False.
        return False
    first = seq[0]
    return all(first == elem for elem in seq)

11voto

6502 Punkte 108136

Dies ist eine weitere Möglichkeit, schneller als len(set(x))==1 für lange Listen (verwendet Kurzschluss)

def constantList(x):
    return x and [x[0]]*len(x) == x

5voto

Gusev Slava Punkte 1918

Prüfen, ob alle Elemente gleich dem ersten sind.

np.allclose(array, array[0])

4voto

Raymond Hettinger Punkte 197261

Beste Antwort

Es gab eine schöne Twitter-Thread über die verschiedenen Möglichkeiten zur Implementierung einer all_equal()-Funktion.

Bei der Eingabe einer Liste war der beste Beitrag:

 t.count(t[0]) == len(t)  

Andere Ansätze

Hier sind die Ergebnisse des Threads:

  1. Lassen Sie groupby() benachbarte Einträge vergleichen. Dies hat ein early-out für eine Fehlanpassung, verwendet keinen zusätzlichen Speicher und läuft mit C-Geschwindigkeit.

    g = itertools.groupby(s)
    next(g, True) and not next(g, False)
  2. Vergleichen Sie zwei Slices, die um eine Position versetzt zueinander sind. Dies benötigt zusätzlichen Speicher, läuft aber mit C-Geschwindigkeit.

    s[1:] == s[:-1]
  3. Iterator-Version des Slice-Vergleichs. Er läuft mit C-Geschwindigkeit und verbraucht keinen zusätzlichen Speicher; allerdings ist die eq Anrufe sind teuer.

    all(map(operator.eq, s, itertools.islice(s, 1, None)))
  4. Vergleichen Sie den niedrigsten und den höchsten Wert. Dies läuft mit C-Geschwindigkeit ab, verbraucht keinen zusätzlichen Speicher, kostet aber zwei Ungleichheitstests pro Datum.

    min(s) == max(s)  # s must be non-empty
  5. Bauen Sie ein Set. Dies läuft mit C-Geschwindigkeit und verbraucht wenig zusätzlichen Speicher, erfordert aber Hashfähigkeit und hat kein Early-out.

    len(set(t))==1.
  6. Mit großem Aufwand werden NaNs und andere Objekte mit exotischen Gleichheitsbeziehungen behandelt.

    all(itertools.starmap(eq, itertools.product(s, repeat=2)))
  7. Ziehen Sie das erste Element heraus und vergleichen Sie alle anderen mit ihm, wobei Sie bei der ersten Nichtübereinstimmung aufhören. Der einzige Nachteil ist, dass dies nicht in C-Geschwindigkeit abläuft.

     it = iter(s)
     a = next(it, None)
     return all(a == b for b in it)
  8. Zählen Sie nur das erste Element. Das ist schnell, einfach und elegant. Es läuft mit C-Geschwindigkeit, benötigt keinen zusätzlichen Speicher, verwendet nur Gleichheitstests und macht nur einen einzigen Durchlauf über die Daten.

      t.count(t[0]) == len(t)

2voto

itertool Punkte 31
def allTheSame(i):
    j = itertools.groupby(i)
    for k in j: break
    for k in j: return False
    return True

Funktioniert in Python 2.4, das kein "all" hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X