HOWTO · Python

Wie man Python-Tupel vergleicht

Lernen Sie mit diesem umfassenden Leitfaden, wie Sie Tupel in Python effektiv vergleichen. Entdecken Sie verschiedene Methoden, darunter Gleichheitsprüfungen, Ungleichheitsprüfungen und lexikografische Vergleiche. Erfahren Sie, wie Sie integrierte Funktionen für den elementweisen Vergleich nutzen. Ob Anfänger oder erfahrener Programmierer — verbessern Sie Ihre Programmierkenntnisse mit praktischen Beispielen und klaren Erklärungen.

Auf dieser Seite

Bei der Arbeit mit Python müssen Sie häufig Tupel miteinander vergleichen. Tupel sind unveränderliche Sequenzen, d. h., sobald sie erstellt wurden, können sie nicht mehr verändert werden. Diese Eigenschaft macht sie besonders nützlich für die Speicherung fester Sammlungen von Elementen. Der Vergleich von Tupeln kann Ihnen helfen, ihre Gleichheit, ihre Reihenfolge und sogar ihren Inhalt zu bestimmen.

In diesem Artikel erfahren Sie, wie Python Tupel vergleicht — von einfachen Gleichheitsprüfungen bis zur lexikografischen Ordnung — und wie sich Vergleiche verhalten, wenn sich die Tupel in Typ, Länge oder Verschachtelung unterscheiden.

Wie Python Tupel vergleicht

Python vergleicht Tupel lexikografisch, so wie Wörter in einem Wörterbuch geordnet sind. Es vergleicht die ersten Elemente der beiden Tupel; unterscheiden sie sich, entscheidet dieser erste Unterschied den Vergleich, und die restlichen Elemente werden gar nicht mehr betrachtet. Sind die ersten Elemente gleich, geht es mit dem nächsten Paar weiter, und so fort, bis ein Unterschied gefunden wird oder keine Elemente mehr übrig sind. Ist ein Tupel ein Präfix des anderen — alle seine Elemente stimmen mit dem Anfang des längeren Tupels überein —, gilt das kürzere Tupel als kleiner als das längere.

Der Gleichheitsoperator (==) prüft, ob beide Tupel dieselben Elemente in derselben Reihenfolge haben, und der Ungleichheitsoperator (!=) ist sein genaues Gegenteil:

tuple1 = (1, 2, 3)
tuple2 = (1, 2, 3)
tuple3 = (1, 2, 4)

print(tuple1 == tuple2)
print(tuple1 == tuple3)
print(tuple1 != tuple3)

Ausgabe:

True
False
True

Die Ordnungsoperatoren (<, <=, >, >=) wenden denselben elementweisen Durchlauf an und nutzen die eigene Ordnung jedes Paares zur Entscheidung:

tuple1 = (1, 2, 3)
tuple2 = (1, 2, 4)
tuple3 = (1, 2)

print(tuple1 < tuple2)
print(tuple1 > tuple3)

Ausgabe:

True
True

Hier ist tuple1 kleiner als tuple2, weil die ersten beiden Elemente gleich sind und 3 < 4 gilt. Und tuple1 ist größer als tuple3, weil tuple3 ein Präfix von tuple1 ist und das längere Tupel daher hinter dem kürzeren steht.

Umgang mit unterschiedlichen Typen, Längen und verschachtelten Tupeln

Gleichheit und Ordnung behandeln gemischte Typen nicht gleich, und die Verwechslung der beiden ist eine häufige Quelle falscher Erwartungen.

Gleichheit löst wegen Typen niemals einen Fehler aus. Zwei Elemente unterschiedlichen Typs sind einfach ungleich — mit der üblichen numerischen Ausnahme, dass Werte wie 1 und 1.0 als gleich gelten —, so dass ein Tupelvergleich mit == False und mit != True zurückgibt, ohne dass jemand zuvor die Typen prüft:

tuple1 = (1, "a", 3)
tuple2 = (1, 2, 3)

print(tuple1 == tuple2)
print(tuple1 != tuple2)

Ausgabe:

False
True

Die Ordnung ist strenger. Sobald ein Ordnungsvergleich ein Elementepaar erreicht, das nicht gegeneinander geordnet werden kann — etwa eine Zeichenkette gegen eine ganze Zahl —, löst er einen TypeError aus, statt ein Ergebnis zurückzugeben:

tuple1 = (1, "a", 3)
tuple2 = (1, 2, 3)

print(tuple1 < tuple2)

Ausgabe:

TypeError: '<' not supported between instances of 'str' and 'int'

Die ersten Elemente sind gleich, also geht der Vergleich weiter zu "a" gegen 2 — und zwischen Zeichenketten und ganzen Zahlen gibt es keine Ordnung, daher der Fehler. Beachten Sie, dass dies nur geschieht, wenn der Vergleich das nicht übereinstimmende Paar tatsächlich erreicht: (0, "a") < (1, 2) gibt False ohne Fehler zurück, weil die ersten Elemente den Vergleich bereits entscheiden.

Unterschiedliche Längen wirken mit einer beliebten elementweisen Gleichheitsprüfung auf leicht zu übersehende Weise zusammen. Die Kombination von all() mit zip() vergleicht die Paare, die zip() erzeugt, und zip() stoppt beim kürzeren Tupel — so dass unpaarige abschließende Elemente stillschweigend ignoriert werden:

tuple1 = (1, 2, 3)
tuple2 = (1, 2)

print(all(a == b for a, b in zip(tuple1, tuple2)))
print(len(tuple1) == len(tuple2) and all(a == b for a, b in zip(tuple1, tuple2)))

Ausgabe:

True
False

Die erste Zeile meldet True, obwohl die Tupel nicht gleich sind, weil die abschließende 3 nie verglichen wird. Wenn Sie dieses Muster verwenden — es ist für große Tupel oder benutzerdefinierte Logik pro Element praktisch —, kombinieren Sie es immer mit einer Längenprüfung, wie in der zweiten Zeile.

Verschachtelte Tupel brauchen keine Sonderbehandlung: Ein Tupel-Element wird mit denselben Regeln verglichen wie jedes andere Element, rekursiv. (1, 2) in einem Tupel steht vor (3, 5) in einem anderen, weil ihre eigenen ersten unterschiedlichen Elemente es entscheiden:

tuple1 = ((1, 2), (3, 4))
tuple2 = ((1, 2), (3, 5))

print(tuple1 < tuple2)
print(tuple1 == tuple2)

Ausgabe:

True
False

Kurz gesagt: Greifen Sie zu == und !=, wenn Sie nur wissen müssen, ob zwei Tupel gleich sind — sie funktionieren mit jedem Inhalt. Verwenden Sie die Ordnungsoperatoren, wenn Sie die relative Reihenfolge benötigen, und stellen Sie sicher, dass die Elemente, die der Vergleich tatsächlich erreicht, gegeneinander geordnet werden können.