Come funziona il confronto delle tuple in Python?


178

Ho letto il libro di programmazione Core Python e l'autore mostra un esempio come:

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

Quindi, mi chiedo, come / perché equivale a falso? In che modo python confronta queste due tuple?

A proposito, non è spiegato nel libro.

Risposte:


190

Le tuple vengono confrontate posizione per posizione: il primo elemento della prima tupla viene confrontato con il primo elemento della seconda tupla; se non sono uguali (ovvero il primo è maggiore o minore del secondo), questo è il risultato del confronto, altrimenti viene considerato il secondo elemento, quindi il terzo e così via.

Vedi le operazioni di sequenza comuni :

Sequenze dello stesso tipo supportano anche confronti. In particolare, le tuple e gli elenchi vengono confrontati lessicograficamente confrontando gli elementi corrispondenti. Ciò significa che per confrontare uguale, ogni elemento deve confrontare uguale e le due sequenze devono essere dello stesso tipo e avere la stessa lunghezza.

Confronti di valore anche per ulteriori dettagli:

Il confronto lessicografico tra collezioni integrate funziona come segue:

  • Affinché due raccolte siano uguali, devono essere dello stesso tipo, avere la stessa lunghezza e ogni coppia di elementi corrispondenti deve essere uguale (ad esempio, [1,2] == (1,2) è falso perché il tipo non è lo stesso).
  • Le raccolte che supportano il confronto degli ordini sono ordinate allo stesso modo dei loro primi elementi disuguali (ad esempio, [1,2,x] <= [1,2,y]hanno lo stesso valore di x <= y). Se non esiste un elemento corrispondente, la raccolta più breve viene ordinata per prima (ad esempio, [1,2] < [1,2,3]è vera).

Se non uguali, le sequenze sono ordinate allo stesso modo dei loro primi elementi diversi. Ad esempio, cmp ([1,2, x], [1,2, y]) restituisce lo stesso cmp (x, y). Se l'elemento corrispondente non esiste, la sequenza più breve viene considerata più piccola (ad esempio, [1,2] <[1,2,3] restituisce True).

Nota 1 : <e >non significa "più piccolo di" e "maggiore di" ma "è prima" e "è dopo": così (0, 1) "è prima" (1, 0).

Nota 2 : le tuple non devono essere considerate vettori in uno spazio n-dimensionale , rispetto alla loro lunghezza.

Nota 3 : riferendosi alla domanda /programming/36911617/python-2-tuple-comparison : non pensare che una tupla sia "maggiore" di un'altra solo se qualsiasi elemento del primo è maggiore del corrispondente uno nel secondo.


4
Questo può essere fuorviante quando si parla di <e >. Ad esempio, (0, 1) < (1, 0)valuta True.
Nessuno il

4
@CMCDragonkai - sì. prova: x = tuple([0 for _ in range(n)])e fai lo stesso per y. L'impostazione di n = 100, 1000, 10.000 e 100.000 e in esecuzione ha %timeit x==ydato valori di temporizzazione rispettivamente di 0,5, 4,6, 43,9 e 443 microsecondi, che è quasi il più vicino possibile a O (n).
Michael Scott Cuthbert,

8
@ J.Money perché pensi che possa essere fuorviante?
Don

1
@CharlieParker <e >non significa "più piccolo di allora" e "più grande di" ma "viene prima" e "viene dopo": così (0, 1)"viene prima"(1, 0)
Don

3
@ Don immagino che non sia chiaro per noi che tipo di ordinamento imporre a una tupla. Immagino che Python lo consideri solo come numeri controllando prima la cifra significativa più grande e passando a morire muore ... (in un modo saggio elemento)
Charlie Parker,

20

La documentazione di Python lo spiega.

Tuple ed elenchi vengono confrontati lessicograficamente mediante il confronto degli elementi corrispondenti. Ciò significa che per confrontare uguale, ogni elemento deve confrontare uguale e le due sequenze devono essere dello stesso tipo e avere la stessa lunghezza.


La pagina ora collegata da questa risposta non sembra contenere il testo citato.
lavaggio:

0

La documentazione di Python 2.5 lo spiega bene.

Tuple ed elenchi vengono confrontati lessicograficamente mediante il confronto degli elementi corrispondenti. Ciò significa che per confrontare uguale, ogni elemento deve confrontare uguale e le due sequenze devono essere dello stesso tipo e avere la stessa lunghezza.

Se non uguali, le sequenze sono ordinate allo stesso modo dei loro primi elementi diversi. Ad esempio, cmp ([1,2, x], [1,2, y]) restituisce lo stesso cmp (x, y). Se l'elemento corrispondente non esiste, viene ordinata prima la sequenza più breve (ad esempio, [1,2] <[1,2,3]).

Sfortunatamente quella pagina sembra essere scomparsa nella documentazione per le versioni più recenti.


0
Ho avuto un po 'di confusione prima riguardo alla comparazione dei numeri interi, quindi spiegherò che è più amichevole per i principianti con un esempio

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

A viene convertito nel suo ASCII corrispondente ord('A') #65 stessa per altri elementi

Quindi, >> a>b # True puoi pensarlo come un confronto tra stringhe (è esattamente, in realtà)

la stessa cosa vale anche per gli interi.

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

perché (1 non è maggiore di 1, passa alla successiva, 2 non è maggiore di 2, passa alla successiva 2 è meno di tre -lexicograficamente -)

Il punto chiave è menzionato nella risposta sopra

pensalo come un elemento prima che un altro non sia alfabeticamente un elemento più grande di un elemento e in questo caso considera tutti gli elementi tupla come una stringa.


2
(1,2,3) > (1,2,2)True
Vishal Singh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.