Ich habe die gelesen Core-Python Programmierbuch, 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.
Anziehen
Tupel werden Position für Position verglichen: das erste Element des ersten Tupels wird mit dem ersten Element des zweiten Tupels verglichen; wenn sie nicht gleich sind (dh das erste ist größer oder kleiner als das zweite), dann ist das das Ergebnis des Vergleichs, sonst wird das zweite Element betrachtet, dann das dritte und so weiter.
Sequenzen des gleichen Typs unterstützen auch Vergleiche. Insbesondere Tupel und Listen werden lexikografisch verglichen, indem entsprechende Elemente verglichen werden. Das bedeutet, dass für einen Gleichheitsvergleich jedes Element gleich sein muss und die beiden Sequenzen vom gleichen Typ sein und die gleiche Länge haben müssen.
Der lexikografische Vergleich zwischen integrierten Sammlungen funktioniert wie folgt:
Damit zwei Sammlungen gleich verglichen werden können, müssen sie vom gleichen Typ sein, die gleiche Länge haben und jedes Paar korrespondierender Elemente muss gleich sein (z. B. [1,2] == (1,2) ist falsch, weil der Typ nicht derselbe ist).
Sammlungen, die einen Ordnungsvergleich unterstützen, werden genauso geordnet wie ihre ersten ungleichen Elemente (z. B. [1,2,x] <= [1,2,y] hat denselben Wert wie x <= y). Wenn kein entsprechendes Element vorhanden ist, wird zuerst die kürzere Sammlung bestellt (z. B. [1,2] < [1,2,3] ist wahr).
Wenn sie nicht gleich sind, werden die Sequenzen genauso geordnet wie ihre ersten unterschiedlichen Elemente. Zum Beispiel cmp([1,2,x], [1,2,y]) gibt dasselbe zurück wie cmp(x,y). Wenn das entsprechende Element nicht existiert, 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 betrachtet werden Vektoren in einem n-dimensionalen Raumverglichen nach ihrer Länge.
Notiz 3: Bezieht sich auf die Frage https://stackoverflow.com/questions/36911617/python-2-tuple-comparison: Denken Sie nicht, dass ein Tupel nur dann “größer” als ein anderes ist, wenn ein Element des ersten größer ist als das entsprechende in der Zweite.
Dies kann irreführend sein, wenn man darüber spricht < und >. Zum Beispiel, (0, 1) < (1, 0) wertet zu True.
– Keiner
30. Juli 2015 um 14:17 Uhr
@CMCDragonkai – ja. Versuchen: x = tuple([0 for _ in range(n)]) und machen Sie dasselbe für y. Festlegen von n = 100, 1000, 10.000 und 100.000 und Ausführen %timeit x==y ergab Timing-Werte von 0,5, 4,6, 43,9 bzw. 443 Mikrosekunden, was ungefähr so nah an O (n) ist, wie Sie praktisch erreichen können.
– Michael Scott Asato Cuthbert
8. Dezember 2015 um 21:41 Uhr
@J.Money, warum denkst du, dass es irreführend sein kann?
– Anziehen
9. Dezember 2015 um 8:49 Uhr
@CharlieParker < und > nicht „kleiner dann“ und „größer dann“, sondern „kommt davor“ und „kommt danach“: also (0, 1) “kommt davor” (1, 0)
– Anziehen
22. September 2016 um 8:09 Uhr
@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 weitermacht, um dies zu brechen … (in einer elementweisen Weise)
Tupel und Listen werden lexikografisch verglichen, indem entsprechende Elemente verglichen werden. Das bedeutet, dass für einen Gleichheitsvergleich jedes Element gleich sein muss und die beiden Sequenzen vom gleichen Typ sein und die gleiche Länge haben müssen.
Die jetzt von dieser Antwort verlinkte Seite scheint den zitierten Text nicht zu enthalten.
– Plugwash
10. März 2020 um 16:09 Uhr
Ich glaube, ein besserer Link zum zitierten Text ist: docs.python.org/3/reference/expressions.html#value-comparisons . Man muss zwar etwas nach unten scrollen, um den zitierten Text zu finden, aber mit dem angegebenen Link muss man nach oben scrollen, was unerwartet ist und die meisten wahrscheinlich nicht tun würden.
Tupel und Listen werden lexikografisch verglichen, indem entsprechende Elemente verglichen werden. Das bedeutet, dass für einen Gleichheitsvergleich jedes Element gleich sein muss und die beiden Sequenzen vom gleichen Typ sein und die gleiche Länge haben müssen.
Wenn sie nicht gleich sind, werden die Sequenzen genauso geordnet wie ihre ersten unterschiedlichen Elemente. Zum Beispiel cmp([1,2,x], [1,2,y]) gibt dasselbe zurück wie cmp(x,y). Wenn das entsprechende Element nicht existiert, wird die kürzere Sequenz zuerst geordnet (z. B. [1,2] < [1,2,3]).
Leider scheint diese Seite in der Dokumentation für neuere Versionen verschwunden zu sein.
Bishoy Kamel
Ich hatte vorher einige Verwirrung bezüglich des ganzzahligen Vergleichs, also werde ich es mit einem Beispiel anfängerfreundlicher erklären
a = ('A','B','C') # see it as the string "ABC"
b = ('A','B','D')
A wird in das entsprechende ASCII umgewandelt ord('A') #65 dasselbe für andere Elemente
So, >> a>b # True
Sie können es sich als Vergleich zwischen Zeichenfolgen vorstellen (es ist genau so)
das gleiche gilt auch für ganze Zahlen.
x = (1,2,2) # see it the string "123"
y = (1,2,3)
x > y # False
denn (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 – lexikografisch -)
Der entscheidende Punkt ist in der obigen Antwort erwähnt
Stellen Sie sich vor, dass ein Element vor einem anderen alphabetisch nicht größer als ein Element ist, und betrachten Sie in diesem Fall alle Tupelelemente als eine Zeichenfolge.
10475400cookie-checkWie funktioniert der Tupelvergleich in Python?yes