Ordenamiento de representaciones de cadenas de enteros

Esta es otra gran trampa que he encontrado hoy.

Gasté horas en depurar mi código y finalmente lo encontré causado por esta configuración extraña.

A continuación se muestra la interfaz de mi python

'3' > '2' True '4' > '3' True '15' > '11' True '999233' > '123' True # At this point, you must think compare string numbers is just like compare numbers. # Me too, but... '5' > '15' True # What's this !!!??? # Meanwhile I am asking this question. I want to something exaggerated to mockerying # this mechanism, and I find something surprised me: '5' > '999233' False # What!!!??? # Suddenly an idea come across my mind, are they comparing the first string number # at first, if they are equal and then compare the second one? # So I tried: '5' > '13333333333333333' True '5' > '61' False # That's it. # my old doubt disappeared and a new question raised: 

¿Por qué diseñaron tal mecanismo en lugar de usar un mecanismo de comparación de números naturales? ¿Cuál es el beneficio de usar este mecanismo en la comparación de “número de cadena”?

Estás comparando cadenas y no números.

20 > 9 evalúa True para tipos numéricos como enteros y flotadores, pero con comparación lexicográfica (cadenas), luego '20' < '9' evalúa como True

Ejemplo:

 $ python >>> 5 > 10 False >>> '5' > '10' True >>> '05' > '10' False >>> 'abc05' > 'bca10' False >>> 'dog' > 'cat' True >>> type('10')  >>> type(10)  

Es una comparación lexicográfica. Tan pronto como se encuentra un elemento mayor que el otro, la comparación se detiene, por lo que

 '5' > '15' 

es cierto porque ‘5’ es mayor que ‘1’

De hecho, el valor ascii del carácter '5' es mayor que el valor '1' por lo que '5' > '15' evalúa como True . Como la comparación de cadenas es byte a byte, al igual que la longitud de una palabra en el diccionario no afecta su posición '5' > '1412423513515' también es True .

 >>> '5' > '15' True >>> ord('5') 53 >>> ord('1') 49 

Piense en la representación de cadena de los enteros como si fueran caracteres alfabéticos, es decir, 'z' > 'abc' evalúa como True porque 'z' aparece después de 'a' . Esto se llama ordenamiento lexicográfico .

La respuesta es que las cadenas se comparan desde el carácter más a la izquierda, o “ordenamiento lexicográfico”. Esto da resultados intuitivos para, por ejemplo,

 "an" < "b" # True 

Si desea comparar los valores de los números que representan las cadenas , debe ser explícito al respecto:

 int("15") < int("5") # False 

Estás comparando cadenas ya que tus números están rodeados por comillas simples.

En python los operadores aplicados en cadenas los comparan usando orden lexicográfico. Puedes probar esto poniendo un ‘0’ antes de ‘5’:

 '05' > '11' 

Está comparando el dígito inicial. Como si fuera alfabético. 5 > 1 es por eso que estas obteniendo 5 > 16