HOWTO · Python

Wie man Listen in Python vergleicht

Vergleichen Sie Python-Listen mit `==`, `Counter`, Mengenoperationen oder einer reihenfolgeerhaltenden List Comprehension, abhängig von Reihenfolge und Duplikaten.

Auf dieser Seite

Um zwei Python-Listen zu vergleichen, klären Sie zuerst, ob Reihenfolge und die Anzahl gleicher Werte wichtig sind. Verwenden Sie == für exakte Reihenfolge, Counter für ungeordnete Gleichheit mit Häufigkeiten, set() für eindeutige Werte und eine List Comprehension für eine geordnete Ergebnisliste.

Python-Listen werden hier passend zu Reihenfolge, Duplikaten und Hashbarkeit verglichen; ==, Counter, set() und sorted() erfüllen unterschiedliche Aufgaben.

Ziel Empfohlene Methode Reihenfolge wichtig Duplikatanzahl wichtig Anforderung an Elemente
Exakte Listengleichheit testen left == right Ja Ja Elemente müssen Gleichheit unterstützen
Ungeordnete Gleichheit testen Counter(left) == Counter(right) Nein Ja Elemente müssen hashbar sein
Eindeutige Werte vergleichen set()-Operationen Nein Nein Elemente müssen hashbar sein
Gemeinsame Elemente in Listenreihenfolge behalten List Comprehension plus Mitgliedschaftsmenge Nur Ausgabereihenfolge Wiederholungen der geprüften Liste bleiben Mitgliedschaftswerte müssen hashbar sein
Anzahlen bei Schnittmenge oder Differenz behalten Counter-Operationen Nein Ja Elemente müssen hashbar sein

Die Methoden beantworten unterschiedliche Fragen: Gleichheit liefert einen Wahrheitswert, Mengen und Counter erzeugen sammlungsähnliche Ergebnisse, und eine Comprehension steuert Form und Reihenfolge einer neuen Liste.

Exakte geordnete Listen mit == vergleichen

Die Listengleichheit prüft die Elemente von links nach rechts; Länge, Werte an jeder Position und damit auch die Reihenfolge müssen übereinstimmen.

"""Verify that list equality considers both values and order."""

first = [1, 2, 3]
same = [1, 2, 3]
reordered = [3, 2, 1]

print(first == same)
print(first == reordered)
True
False

Der zweite Vergleich ist trotz derselben eindeutigen Werte False; direkte Gleichheit funktioniert außerdem mit nicht hashbaren Elementen wie verschachtelten Listen.

Die Vergleiche folgen den Gleichheitsregeln der Elemente, etwa einer __eq__-Implementierung eigener Objekte, und zeigen nicht die genaue Stelle einer Abweichung in verschachtelten Daten.

Ungeordnete Listen mit Duplikaten mit Counter vergleichen

Verwenden Sie collections.Counter, wenn die Reihenfolge egal ist, die Häufigkeit jedes hashbaren Werts aber erhalten bleiben muss.

"""Compare unordered lists with and without duplicate multiplicity."""

from collections import Counter

left = [1, 2, 2, 3]
reordered = [3, 2, 1, 2]
fewer_duplicates = [3, 2, 1]

print(Counter(left) == Counter(reordered))
print(Counter(left) == Counter(fewer_duplicates))
print(set(left) == set(fewer_duplicates))
True
False
True

Die Ausgabe zeigt die Grenze klar: Counter erkennt die fehlende zweite 2, während ein Set Duplikate verwirft und deshalb Gleichheit meldet.

sorted(left) == sorted(right) berücksichtigt ebenfalls Duplikate, setzt aber gegenseitig vergleichbare Werte voraus und sortiert beide Listen; Counter beschreibt die gewünschte Semantik meist direkter.

Eindeutige Werte, Schnittmenge und Differenzen mit set() vergleichen

Wandeln Sie Listen in Mengen um, wenn nur verschiedene Werte zählen: & bildet die Schnittmenge, - die gerichtete Differenz und ^ die symmetrische Differenz.

Im Beispiel werden nur die ausgegebenen Mengen sortiert, damit die Ausgabe stabil bleibt; eine Menge selbst besitzt keine festgelegte Reihenfolge.

Eine Menge ist für viele Mitgliedschaftstests praktisch, verliert jedoch Position und Häufigkeit; verlassen Sie sich nie auf ihre gedruckte Reihenfolge.

"""Verify unique-value, order-preserving, and multiplicity-aware differences."""

from collections import Counter

left = [1, 2, 2, 3, 4]
right = [2, 3, 3, 5]
left_set = set(left)
right_set = set(right)

print(sorted(left_set & right_set))
print(sorted(left_set - right_set))
print(sorted(right_set - left_set))

right_members = set(right)
print([item for item in left if item in right_members])

left_counts = Counter(left)
right_counts = Counter(right)
print(sorted((left_counts & right_counts).elements()))
print(sorted((left_counts - right_counts).elements()))
print(sorted((right_counts - left_counts).elements()))
[2, 3]
[1, 4]
[5]
[2, 2, 3]
[2, 3]
[1, 2, 4]
[3, 5]

Die ersten drei Ausgabelinien zeigen eindeutige Schnittmenge und gerichtete Differenzen; left_set ^ right_set ergäbe hier die Werte 1, 4 und 5 in nicht festgelegter Reihenfolge.

Ergebnisreihenfolge mit einer List Comprehension erhalten

Ein Mengenergebnis behält die Reihenfolge der ersten Liste nicht bei; erstellen Sie daher eine Mitgliedschaftsmenge und durchlaufen Sie die Liste, deren Reihenfolge das Ergebnis behalten soll.

Die vierte Ausgabelinie [2, 2, 3] bewahrt Reihenfolge und Wiederholungen aus left; bei nicht hashbaren Werten bleibt die gleichheitsbasierte Mitgliedschaft, die bei großen Listen teurer sein kann.

Häufigkeiten in Schnittmengen und Differenzen mit Counter erhalten

Mengen beantworten Fragen zu eindeutigen Werten, während Counter dieselben Schnittmengen- und Differenzfragen mit Häufigkeiten beantwortet.

  • left_counts & right_counts behält für jeden gemeinsamen Wert die kleinste positive Anzahl.
  • left_counts - right_counts subtrahiert Anzahlen und behält nur positive Reste.
  • right_counts - left_counts liefert die Differenz in der anderen Richtung.
  • .elements() entfaltet die gezählten Werte wieder zu einzelnen Elementen.

Die Multimengen-Schnittmenge ist [2, 3], nicht [2, 2, 3], weil die 2 rechts nur einmal vorkommt; die Reste sind links [1, 2, 4] und rechts [3, 5].

Diese Methode passt zu Beständen, Stimmen oder wiederholten Tags; ein gewöhnliches Set würde die Mengeninformation stillschweigend löschen.

Counter-Arithmetik entfernt Null- und Negativwerte; prüfen Sie die Zähler direkt, wenn eine Anwendung solche Salden behalten muss.

Nicht hashbare Werte behandeln und die richtige Methode wählen

set() und Counter brauchen hashbare Elemente. Da Listen veränderlich und nicht hashbar sind, lösen verschachtelte Listen TypeError aus, während direkte Gleichheit weiter funktioniert.

"""Show the unhashable-item boundary of set and Counter comparisons."""

from collections import Counter

left = [[1], [2]]
right = [[1], [2]]

print(left == right)
for name, operation in (("set", set), ("Counter", Counter)):
    try:
        operation(left)
    except TypeError as error:
        print(f"{name}: {error}")
True
set: cannot use 'list' as a set element (unhashable type: 'list')
Counter: unhashable type: 'list'

Die genaue set-Meldung kann je nach Python-Version abweichen; stabil sind jedoch der Ausnahmetyp und die Ursache des nicht hashbaren Elements.

Wandeln Sie innere Listen bei einer passenden unveränderlichen Darstellung in Tupel um, oder verwenden Sie einen gleichheitsbasierten Vergleich; wählen Sie stets die Darstellung, die Reihenfolge und Duplikate korrekt ausdrückt.