¿Cómo se comparan las cadenas?

Resuelto davelupt asked hace 13 años • 7 respuestas

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 aes menor que b(primera posición) en la primera cadena en lugar del hecho eso aes menor que ben 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? .

davelupt avatar Jan 26 '11 23:01 davelupt
Aceptado

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 Falsese devuelve tan pronto como ase determina que es menor que b. Los demás elementos no se comparan (como puede ver para los segundos elementos: b> aes 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, Trueya 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.

user225312 avatar Jan 26 '2011 16:01 user225312

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í.

wkl avatar Jan 26 '2011 16:01 wkl

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.

John Machin avatar Jan 26 '2011 19:01 John Machin