Comment fonctionne la comparaison de tuple en Python?

179

J'ai lu le livre de programmation Core Python , et l'auteur montre un exemple comme:

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

Alors, je me demande, comment / pourquoi est-ce faux? Comment python compare-t-il ces deux tuples?

Btw, ce n'est pas expliqué dans le livre.

Paulo
la source

Réponses:

190

Les tuples sont comparés position par position: le premier élément du premier tuple est comparé au premier élément du deuxième tuple; s'ils ne sont pas égaux (c'est-à-dire que le premier est plus grand ou plus petit que le second) alors c'est le résultat de la comparaison, sinon le deuxième élément est considéré, puis le troisième et ainsi de suite.

Voir Opérations de séquence courantes :

Les séquences du même type prennent également en charge les comparaisons. En particulier, les tuples et les listes sont comparés lexicographiquement en comparant les éléments correspondants. Cela signifie que pour comparer égal, chaque élément doit comparer égal et les deux séquences doivent être du même type et avoir la même longueur.

Également des comparaisons de valeur pour plus de détails:

La comparaison lexicographique entre les collections intégrées fonctionne comme suit:

  • Pour que deux collections soient comparables, elles doivent être du même type, avoir la même longueur et chaque paire d'éléments correspondants doit être comparable (par exemple, [1,2] == (1,2)est faux car le type n'est pas le même).
  • Les collections qui prennent en charge la comparaison des ordres sont classées de la même manière que leurs premiers éléments inégaux (par exemple, [1,2,x] <= [1,2,y]a la même valeur que x <= y). Si un élément correspondant n'existe pas, la collection la plus courte est ordonnée en premier (par exemple, [1,2] < [1,2,3]est vrai).

Si ce n'est pas égal, les séquences sont ordonnées de la même manière que leurs premiers éléments différents. Par exemple, cmp ([1,2, x], [1,2, y]) renvoie la même chose que cmp (x, y). Si l'élément correspondant n'existe pas, la séquence la plus courte est considérée comme plus petite (par exemple, [1,2] <[1,2,3] renvoie True).

Note 1 : <et >ne signifie pas «plus petit que» et «supérieur à» mais «est avant» et «est après»: donc (0, 1) «est avant» (1, 0).

Note 2 : les tuples ne doivent pas être considérés comme des vecteurs dans un espace à n dimensions , comparés en fonction de leur longueur.

Note 3 : en se référant à la question /programming/36911617/python-2-tuple-comparison : ne pensez pas qu'un tuple est "supérieur" à un autre seulement si un élément du premier est supérieur au correspondant un dans le second.

Don
la source
4
Cela peut être trompeur quand on parle de <et >. Par exemple, (0, 1) < (1, 0)évalue à True.
Aucun
4
@CMCDragonkai - oui. essayez: x = tuple([0 for _ in range(n)])et faites de même pour y. Le réglage n = 100, 1000, 10 000 et 100 000 et l'exécution ont %timeit x==ydonné des valeurs de synchronisation de 0,5, 4,6, 43,9 et 443 microsecondes respectivement, ce qui est à peu près aussi proche de O (n) que vous pouvez pratiquement obtenir.
Michael Scott Cuthbert
8
@ J.Money pourquoi pensez-vous que cela peut être trompeur?
Don
1
@CharlieParker <et >ne veut pas dire "plus petit alors" et "plus grand alors" mais "vient avant" et "vient après": donc (0, 1)"vient avant"(1, 0)
Don
3
@Don Je suppose que nous ne savons pas quel type de commande imposer à un tuple. Je suppose que python le traite simplement comme des nombres en vérifiant d'abord le plus grand chiffre significatif et le passage à la rupture meurt ... (de manière élémentaire)
Charlie Parker
20

La documentation Python l' explique.

Les tuples et les listes sont comparés lexicographiquement en utilisant la comparaison des éléments correspondants. Cela signifie que pour comparer égal, chaque élément doit comparer égal et les deux séquences doivent être du même type et avoir la même longueur.

Keith
la source
La page maintenant liée à cette réponse ne semble pas contenir le texte cité.
plugwash
0

La documentation python 2.5 l' explique bien.

Les tuples et les listes sont comparés lexicographiquement en utilisant la comparaison des éléments correspondants. Cela signifie que pour comparer égal, chaque élément doit comparer égal et les deux séquences doivent être du même type et avoir la même longueur.

Si ce n'est pas égal, les séquences sont ordonnées de la même manière que leurs premiers éléments différents. Par exemple, cmp ([1,2, x], [1,2, y]) renvoie la même chose que cmp (x, y). Si l'élément correspondant n'existe pas, la séquence la plus courte est ordonnée en premier (par exemple, [1,2] <[1,2,3]).

Malheureusement, cette page semble avoir disparu de la documentation des versions plus récentes.

plugwash
la source
0
J'avais une certaine confusion avant concernant la comparaison d'entiers, donc je vais l'expliquer pour être plus convivial pour les débutants avec un exemple

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

A est converti en son ASCII correspondant ord('A') #65pour les autres éléments

Donc, >> a>b # True vous pouvez le considérer comme une comparaison entre une chaîne (c'est exactement, en fait)

il en va de même pour les nombres entiers.

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

parce que (1 n'est pas supérieur à 1, passer au suivant, 2 n'est pas supérieur à 2, passer au suivant 2 est inférieur à trois -lexicographiquement -)

Le point clé est mentionné dans la réponse ci-dessus

Considérez-le comme un élément est avant qu'un autre élément alphabétiquement not est supérieur à un élément et dans ce cas, considérez tous les éléments de tuple comme une chaîne.

Bishoy Abd
la source
2
(1,2,3) > (1,2,2)donneTrue
Vishal Singh