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_countsbehält für jeden gemeinsamen Wert die kleinste positive Anzahl.left_counts - right_countssubtrahiert Anzahlen und behält nur positive Reste.right_counts - left_countsliefert 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.