unidad que linguistica ingles enseñanza aplicada python string comparison

que - Técnica de comparación de cuerdas utilizada por Python



que es la linguistica en ingles (8)

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 que ( < ) o mayor que ( > ).

Por ejemplo, si pongo print(''abc'' < ''bac'') , obtengo True . Entiendo que compara los caracteres correspondientes en la cadena, pero no está claro por qué hay más, por falta de un término mejor, "peso" puesto en el hecho de que a es menor que b (primera posición) en la primera cadena en lugar de el hecho de que a es menor que b en la segunda cuerda (segunda posición).


Aquí hay un código de muestra que compara dos cadenas lexicográficamente.

a = str(input()) b = str(input()) if 1<=len(a)<=100 and 1<=len(b)<=100: a = a.lower() b = b.lower() if a > b: print(''1'') elif a < b: print( ''-1'') elif a == b: print(''0'')

para diferentes entradas las salidas son-

1- abcdefg abcdeff 1 2- abc Abc 0 3- abs AbZ -1


De los docs :

La comparación utiliza ordenamiento lexicográfico: primero se comparan los dos primeros elementos, y si difieren, esto determina el resultado de la comparación; si son iguales, los siguientes dos elementos se comparan, y así sucesivamente, hasta que se agote cualquiera de las secuencias.

También:

El orden lexicográfico para cadenas utiliza el número de punto de código Unicode para ordenar caracteres individuales.

o en Python 2 :

El orden lexicográfico para cadenas usa 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 se encuentre que a es menor que b . Los elementos adicionales no se comparan (como puede ver para los segundos elementos: b > a es True ).

Tenga en cuenta mayúsculas y minú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)]


Eche un vistazo también a ¿Cómo clasifico las cadenas de unicode alfabéticamente en Python? donde la discusión trata sobre las reglas de ordenación proporcionadas por el Algoritmo de intercalación Unicode ( http://www.unicode.org/reports/tr10/ ).

Para responder al comentario

¿Qué? ¿De qué otro modo se puede ordenar de otra forma que no sea de izquierda a derecha?

por S.Lott, hay un famoso contraejemplo al clasificar el idioma francés. Implica acentos: de hecho, podría decirse que, en francés, las letras se ordenan de izquierda a derecha y los acentos de derecha a izquierda. Aquí está el contraejemplo: tenemos e <é y o <ô, por lo que cabría esperar que las palabras cote, coté, côte, côté se clasifiquen como cote <coté <côte <côté. Bueno, esto no es lo que sucede, de hecho, usted tiene: cote <côte <coté <côté, es decir, si eliminamos "c" y "t", obtenemos oe <ôe <oé <ôé, que es exactamente correcto-a - dejar de ordenar.

Y una última observación: no debería estar hablando de clasificación de izquierda a derecha y de derecha a izquierda, sino más bien de clasificación hacia adelante y hacia atrás .

De hecho, hay idiomas escritos de derecha a izquierda y si crees que el árabe y el hebreo se ordenan de derecha a izquierda, es posible que tengas razón desde el punto de vista gráfico, ¡pero te equivocas en el nivel lógico!

De hecho, Unicode considera cadenas de caracteres codificadas en orden lógico , y la dirección de escritura es un fenómeno que ocurre en el nivel de glifo. En otras palabras, incluso si en la palabra שלום la letra shin aparece a la derecha de la lamed, lógicamente ocurre antes que ella. Para ordenar esta palabra, primero se considerará la espinilla, luego la lamed, luego la vav, luego la mem, y esto es ordenando hacia delante (aunque el hebreo se escribe de derecha a izquierda), mientras que los acentos franceses se ordenan hacia atrás (aunque el francés es escrito de izquierda a derecha).



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 completamente 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 allí mismo.


Python y casi todos los demás lenguajes de computadora usan los mismos principios que (espero) que usarías para encontrar una palabra en un diccionario impreso:

(1) Dependiendo del lenguaje humano involucrado, tiene una noción de orden de caracteres: ''a'' <''b'' <''c'', etc.

(2) El primer carácter tiene más peso que el segundo carácter: ''az'' <''za'' (si el idioma está escrito de izquierda a derecha o de derecha a izquierda o boustrophedon es bastante irrelevante)

(3) Si se quedan sin caracteres para probar, la cadena más corta es menor que la cadena más larga: ''foo'' <''food''

Normalmente, en un lenguaje informático, la "noción de ordenación de caracteres" es bastante primitiva: cada personaje tiene un número ord(character) numérico independiente del lenguaje humano y los personajes se comparan y ordenan usando ese número. A menudo ese orden no es apropiado para el lenguaje humano del usuario, y luego tiene que entrar en "cotejo", un tema divertido.


Un equivalente puro de Python para las comparaciones de cadenas sería:

def less(string1, string2): # Compare character by character for idx in range(min(len(string1), len(string2))): # Get the "value" of the character ordinal1, ordinal2 = ord(string1[idx]), ord(string2[idx]) # If the "value" is identical check the next characters if ordinal1 == ordinal2: continue # If it''s smaller we''re finished and can return True elif ordinal1 < ordinal2: return True # If it''s bigger we''re finished and return False else: return False # We''re out of characters and all were equal, so the result is False return False

Esta función hace el equivalente del método real ( Python 3.6 y Python 2.7 ) mucho más lento. También tenga en cuenta que la implementación no es exactamente "pitónica" y solo funciona para < comparaciones. Es solo para ilustrar cómo funciona. No he comprobado si funciona como la comparación de Pitones para los caracteres combinados de Unicode .

Una variante más general sería:

from operator import lt, gt def compare(string1, string2, less=True): op = lt if less else gt for char1, char2 in zip(string1, string2): ordinal1, ordinal2 = ord(char1), ord(char1) if ordinal1 == ordinal2: continue elif op(ordinal1, ordinal2): return True else: return False return False