¿Cómo funciona la comparación de tuplas en Python?

178

He estado leyendo el libro de programación Core Python , y el autor muestra un ejemplo como:

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

Entonces, me pregunto, ¿cómo / por qué es igual a falso? ¿Cómo compara Python estas dos tuplas?

Por cierto, no se explica en el libro.

Paulo
fuente

Respuestas:

191

Las tuplas se comparan posición por posición: el primer elemento de la primera tupla se compara con el primer elemento de la segunda tupla; si no son iguales (es decir, el primero es mayor o menor que el segundo) entonces ese es el resultado de la comparación, de lo contrario se considera el segundo elemento, luego el tercero y así sucesivamente.

Ver operaciones de secuencia común :

Las secuencias del mismo tipo también admiten comparaciones. En particular, las tuplas y las listas se comparan lexicográficamente comparando los elementos correspondientes. Esto significa que para comparar igual, cada elemento debe comparar igual y las dos secuencias deben ser del mismo tipo y tener la misma longitud.

También comparaciones de valores para más detalles:

La comparación lexicográfica entre las colecciones incorporadas funciona de la siguiente manera:

  • Para que dos colecciones comparen iguales, deben ser del mismo tipo, tener la misma longitud y cada par de elementos correspondientes debe comparar iguales (por ejemplo, [1,2] == (1,2) es falso porque el tipo no es el mismo).
  • Las colecciones que admiten la comparación de pedidos se ordenan igual que sus primeros elementos desiguales (por ejemplo, [1,2,x] <= [1,2,y]tiene el mismo valor que x <= y). Si no existe un elemento correspondiente, la colección más corta se ordena primero (por ejemplo, [1,2] < [1,2,3]es verdadera).

Si no es igual, las secuencias se ordenan igual que sus primeros elementos diferentes. Por ejemplo, cmp ([1,2, x], [1,2, y]) devuelve lo mismo que cmp (x, y). Si el elemento correspondiente no existe, la secuencia más corta se considera más pequeña (por ejemplo, [1,2] <[1,2,3] devuelve True).

Nota 1 : <y >no significa "menor que" y "mayor que" pero "es anterior" y "es posterior": entonces (0, 1) "es anterior" (1, 0).

Nota 2 : las tuplas no deben considerarse como vectores en un espacio n-dimensional , en comparación con su longitud.

Nota 3 : refiriéndose a la pregunta /programming/36911617/python-2-tuple-comparison : no piense que una tupla es "mayor" que otra solo si algún elemento del primero es mayor que el correspondiente uno en el segundo

Don
fuente
44
Esto puede ser engañoso cuando se habla de <y >. Por ejemplo, (0, 1) < (1, 0)evalúa a True.
Ninguno
44
@CMCDragonkai: sí. intente: x = tuple([0 for _ in range(n)])y haga lo mismo para y. Establecer n = 100, 1000, 10,000 y 100,000 y ejecutar %timeit x==yvalores de tiempo de .5, 4.6, 43.9 y 443 microsegundos respectivamente, que es lo más cercano a O (n) que prácticamente puede obtener.
Michael Scott Cuthbert
8
@ J.Money, ¿por qué crees que puede ser engañoso?
Don
1
@CharlieParker <y >no significa "menor que" y "mayor que", sino "viene antes" y "viene después": así que (0, 1)"viene antes"(1, 0)
Don
3
@ Don Supongo que no está claro qué tipo de orden imponer a una tupla. Supongo que Python solo lo trata como números marcando primero el dígito significativo más grande y luego avanzando para romper los troqueles ... (en forma de elementos)
Charlie Parker
20

La documentación de Python lo explica.

Las tuplas y las listas se comparan lexicográficamente utilizando la comparación de los elementos correspondientes. Esto significa que para comparar igual, cada elemento debe comparar igual y las dos secuencias deben ser del mismo tipo y tener la misma longitud.

Keith
fuente
La página ahora vinculada desde esta respuesta no parece contener el texto citado.
lavar
0

La documentación de Python 2.5 lo explica bien.

Las tuplas y las listas se comparan lexicográficamente utilizando la comparación de los elementos correspondientes. Esto significa que para comparar igual, cada elemento debe comparar igual y las dos secuencias deben ser del mismo tipo y tener la misma longitud.

Si no es igual, las secuencias se ordenan igual que sus primeros elementos diferentes. Por ejemplo, cmp ([1,2, x], [1,2, y]) devuelve lo mismo que cmp (x, y). Si el elemento correspondiente no existe, la secuencia más corta se ordena primero (por ejemplo, [1,2] <[1,2,3]).

Lamentablemente, esa página parece haber desaparecido en la documentación de las versiones más recientes.

lavado
fuente
0
Tuve cierta confusión antes con respecto a la comparación de enteros, por lo que explicaré que sea más amigable para los principiantes con un ejemplo

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

A se convierte a su correspondiente ASCII ord('A') #65 igual para otros elementos

Entonces, >> a>b # True puedes pensar que es una comparación entre una cadena (es exactamente, en realidad)

Lo mismo ocurre con los enteros también.

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

porque (1 no es mayor que 1, pasar al siguiente, 2 no es mayor que 2, pasar al siguiente 2 es menor que tres -lexicográficamente-)

El punto clave se menciona en la respuesta anterior.

piense que es un elemento antes de que otro elemento alfabéticamente no sea mayor que un elemento y, en este caso, considere todos los elementos de tupla como una cadena.

Bishoy Abd
fuente
2
(1,2,3) > (1,2,2)daTrue
Vishal Singh