Wie funktioniert der Tupelvergleich in Python?

Lesezeit: 5 Minuten

Benutzer-Avatar
Paulo

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.

Benutzer-Avatar
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.

Sehen Allgemeine Sequenzoperationen:

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.

Ebenfalls 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, 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)

    – Charly Parker

    22. September 2016 um 15:41 Uhr

Benutzer-Avatar
Keith

Das Python-Dokumentation erklärt es.

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.

    – bartonstanley

    28. November 2021 um 20:48 Uhr


Das Python 2.5-Dokumentation erklärt es gut.

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.

Benutzer-Avatar
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.

1047540cookie-checkWie funktioniert der Tupelvergleich in Python?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy