¿Cómo se comparan las cadenas?
Me pregunto cómo hace Python la comparación de cadenas, más específicamente cómo determina el resultado cuando se utiliza un operador menor <
o mayor que .>
Por ejemplo si pongo print('abc' < 'bac')
obtengo True
. Entiendo que compara los caracteres correspondientes en la cadena, sin embargo, no está claro por qué hay más, a falta de un término mejor, "peso" colocado en el hecho de que a
es menor que b
(primera posición) en la primera cadena en lugar del hecho eso a
es menor que b
en la segunda cadena (segunda posición).
Mucha gente hace esta pregunta cuando las cadenas contienen representaciones de números y quieren comparar los números por valor numérico. La solución sencilla es convertir los valores primero. Consulte ¿Cómo analizo una cadena en flotante o int? . Si hay varios números en una lista u otra colección, consulte ¿Cómo puedo recopilar los resultados de un cálculo repetido en una lista, diccionario, etc. (o hacer una copia de una lista con cada elemento modificado)? para la conversión por lotes.
Si está intentando comparar cadenas que contienen secuencias de dígitos, tratando los dígitos como si fueran numéricos (a veces llamado "ordenación natural"), consulte ¿Existe una función integrada para la ordenación natural de cadenas? .
De los documentos :
La comparación utiliza orden lexicográfico: primero se comparan los dos primeros elementos y, si difieren, se determina el resultado de la comparación; si son iguales, se comparan los dos elementos siguientes, y así sucesivamente, hasta que se agote cualquiera de las secuencias.
También:
El orden lexicográfico de cadenas utiliza el número de punto del código Unicode para ordenar caracteres individuales.
o en Python 2 :
El orden lexicográfico de cadenas utiliza el orden ASCII para caracteres individuales.
Como ejemplo:
>>> 'abc' > 'bac'
False
>>> ord('a'), ord('b')
(97, 98)
El resultado False
se devuelve tan pronto como a
se determina que es menor que b
. Los demás elementos no se comparan (como puede ver para los segundos elementos: b
> a
es True
).
Tenga en cuenta las minúsculas y mayúsculas:
>>> [(x, ord(x)) for x in abc]
[('a', 97), ('b', 98), ('c', 99), ('d', 100), ('e', 101), ('f', 102), ('g', 103), ('h', 104), ('i', 105), ('j', 106), ('k', 107), ('l', 108), ('m', 109), ('n', 110), ('o', 111), ('p', 112), ('q', 113), ('r', 114), ('s', 115), ('t', 116), ('u', 117), ('v', 118), ('w', 119), ('x', 120), ('y', 121), ('z', 122)]
>>> [(x, ord(x)) for x in abc.upper()]
[('A', 65), ('B', 66), ('C', 67), ('D', 68), ('E', 69), ('F', 70), ('G', 71), ('H', 72), ('I', 73), ('J', 74), ('K', 75), ('L', 76), ('M', 77), ('N', 78), ('O', 79), ('P', 80), ('Q', 81), ('R', 82), ('S', 83), ('T', 84), ('U', 85), ('V', 86), ('W', 87), ('X', 88), ('Y', 89), ('Z', 90)]
Específicamente, esto tiene la consecuencia de que 'a' > 'A'
, 'b' > 'B'
, etc. incluyan 'a' > 'Z'
todas las evaluaciones, True
ya que todos los caracteres en minúscula de la a a la z tienen un número de punto de código más alto que todos los caracteres en mayúscula.
La comparación de cadenas de Python es lexicográfica:
De Python Docs: http://docs.python.org/reference/expressions.html
Las cadenas se comparan lexicográficamente utilizando los equivalentes numéricos (el resultado de la función incorporada ord()) de sus caracteres. Las cadenas Unicode y de 8 bits son totalmente interoperables en este comportamiento.
Por lo tanto, en su ejemplo, 'abc' < 'bac'
'a' viene antes (menor que) 'b' numéricamente (en representaciones ASCII y Unicode), por lo que la comparación termina ahí.
Python y casi todos los demás lenguajes informáticos utilizan los mismos principios que (espero) utilizarías al buscar una palabra en un diccionario impreso:
(1) Dependiendo del lenguaje humano involucrado, tiene una noción del orden de los caracteres: 'a' < 'b' < 'c', etc.
(2) El primer carácter tiene más peso que el segundo carácter: 'az' < 'za' (si el idioma se escribe de izquierda a derecha o de derecha a izquierda o boustrophedon es bastante irrelevante)
(3) Si te quedas sin caracteres para probar, la cadena más corta es menor que la cadena más larga: 'foo' < 'comida'
Normalmente, en un lenguaje informático la "noción de ordenación de caracteres" es bastante primitiva: cada carácter tiene un número independiente del lenguaje humano ord(character)
y los caracteres se comparan y clasifican utilizando ese número. Muchas veces ese orden no es apropiado para el lenguaje humano del usuario, y entonces hay que entrar en el "cotejo", un tema divertido.