Wie funktioniert der Tupelvergleich in Python?

178

Ich habe das Core Python- Programmierbuch gelesen und der Autor zeigt ein Beispiel wie:

(4, 5) < (3, 5) # Equals false

Also frage ich mich, wie / warum ist es gleich falsch? Wie vergleicht Python diese beiden Tupel?

Übrigens wird es im Buch nicht erklärt.

Paulo
quelle

Antworten:

191

Tupel werden Position für Position verglichen: Der erste Gegenstand des ersten Tupels wird mit dem ersten Gegenstand des zweiten Tupels verglichen; Wenn sie nicht gleich sind (dh der erste ist größer oder kleiner als der zweite), ist dies das Ergebnis des Vergleichs, andernfalls wird der zweite Punkt berücksichtigt, dann der dritte und so weiter.

Siehe Allgemeine Sequenzoperationen :

Sequenzen des gleichen Typs unterstützen auch Vergleiche. Insbesondere werden Tupel und Listen lexikographisch verglichen, indem entsprechende Elemente verglichen werden. Dies bedeutet, dass zum Vergleichen gleich jedes Element gleich vergleichen muss und die beiden Sequenzen vom gleichen Typ sein und die gleiche Länge haben müssen.

Auch Wertvergleiche für weitere Details:

Der lexikografische Vergleich zwischen integrierten Sammlungen funktioniert wie folgt:

  • Damit zwei Sammlungen gleich verglichen werden können, müssen sie vom gleichen Typ sein, dieselbe Länge haben und jedes Paar entsprechender Elemente muss gleich sein (z. B. [1,2] == (1,2)ist falsch, weil der Typ nicht gleich ist).
  • Sammlungen, die den Auftragsvergleich unterstützen, werden genauso geordnet wie ihre ersten ungleichen Elemente (haben beispielsweise [1,2,x] <= [1,2,y]den gleichen Wert wie x <= y). Wenn kein entsprechendes Element vorhanden ist, wird zuerst die kürzere Sammlung sortiert (z. B. [1,2] < [1,2,3]true).

Wenn nicht gleich, werden die Sequenzen genauso geordnet wie ihre ersten unterschiedlichen Elemente. Beispielsweise gibt cmp ([1,2, x], [1,2, y]) dasselbe zurück wie cmp (x, y). Wenn das entsprechende Element nicht vorhanden ist, wird die kürzere Sequenz als kleiner betrachtet (z. B. [1,2] <[1,2,3] gibt True zurück).

Anmerkung 1 : <und >bedeuten nicht "kleiner als" und "größer als", sondern "ist vor" und "ist nach": also (0, 1) "ist vor" (1, 0).

Anmerkung 2 : Tupel dürfen nicht als Vektoren in einem n-dimensionalen Raum betrachtet werden , verglichen mit ihrer Länge.

Hinweis 3 : Beziehen Sie sich auf Frage /programming/36911617/python-2-tuple-comparison : Denken Sie nicht, dass ein Tupel nur dann "größer" als ein anderes ist, wenn ein Element des ersten Tupels größer als das entsprechende ist einer in der zweiten.

Don
quelle
4
Dies kann irreführend sein, wenn über <und gesprochen wird >. Zum Beispiel (0, 1) < (1, 0)wertet auf aus True.
Keine
4
@CMCDragonkai - ja. versuche: x = tuple([0 for _ in range(n)])und mache dasselbe für y. Das Setzen von n = 100, 1000, 10.000 und 100.000 und das Ausführen %timeit x==yergaben Zeitwerte von 0,5, 4,6, 43,9 bzw. 443 Mikrosekunden, was ungefähr so ​​nahe an O (n) liegt, wie Sie praktisch erhalten können.
Michael Scott Cuthbert
8
@ J.Money warum denkst du, kann es irreführend sein?
Don
1
@CharlieParker <und >bedeuten nicht "kleiner als" und "größer als", sondern "kommt vor" und "kommt nach": also (0, 1)"kommt vor"(1, 0)
Don
3
@ Don Ich denke, es ist uns nicht klar, welche Art von Bestellung einem Tupel auferlegt werden soll. Ich denke, Python behandelt es einfach als Zahlen, indem es zuerst die größte signifikante Ziffer überprüft und dann weitergeht, um zu sterben ... (auf elementweise Weise)
Charlie Parker
20

Die Python-Dokumentation erklärt es.

Tupel und Listen werden lexikographisch verglichen, indem die entsprechenden Elemente verglichen werden. Dies bedeutet, dass zum Vergleichen gleich jedes Element gleich vergleichen muss und die beiden Sequenzen vom gleichen Typ und von gleicher Länge sein müssen.

Keith
quelle
Die Seite, die jetzt mit dieser Antwort verlinkt ist, scheint den zitierten Text nicht zu enthalten.
Plugwash
0

Die Python 2.5-Dokumentation erklärt es gut.

Tupel und Listen werden lexikographisch verglichen, indem die entsprechenden Elemente verglichen werden. Dies bedeutet, dass zum Vergleichen gleich jedes Element gleich vergleichen muss und die beiden Sequenzen vom gleichen Typ und von gleicher Länge sein müssen.

Wenn nicht gleich, werden die Sequenzen genauso geordnet wie ihre ersten unterschiedlichen Elemente. Beispielsweise gibt cmp ([1,2, x], [1,2, y]) dasselbe zurück wie cmp (x, y). Wenn das entsprechende Element nicht vorhanden ist, wird zuerst die kürzere Sequenz geordnet (z. B. [1,2] <[1,2,3]).

Leider scheint diese Seite in der Dokumentation für neuere Versionen verschwunden zu sein.

Plugwash
quelle
0
Ich hatte vorher einige Verwirrung bezüglich des Ganzzahlvergleichs, daher werde ich es anhand eines Beispiels als anfängerfreundlicher erklären

a = ('A','B','C') # see it as the string "ABC" b = ('A','B','D')

A wird ord('A') #65für andere Elemente in das entsprechende ASCII konvertiert

So >> a>b # True können Sie daran denken als Vergleich zwischen string (Es ist genau das , tatsächlich)

Das Gleiche gilt auch für ganze Zahlen.

x = (1,2,2) # see it the string "123" y = (1,2,3) x > y # False

weil (1 ist nicht größer als 1, gehe zum nächsten, 2 ist nicht größer als 2, gehe zum nächsten 2 ist kleiner als drei - flexikographisch -)

Der entscheidende Punkt wird in der obigen Antwort erwähnt

Betrachten Sie es als ein Element, bevor ein anderes alphabetisch nicht Element größer als ein Element ist, und betrachten Sie in diesem Fall alle Tupelelemente als eine Zeichenfolge.

Bishoy Abd
quelle
2
(1,2,3) > (1,2,2)gibtTrue
Vishal Singh