python sorting python-3.x

¿Cómo usar una función de comparación personalizada en Python 3?



sorting python-3.x (5)

En Python 2.x , podía pasar funciones personalizadas a funciones ordenadas y ordenadas

>>> x=[''kar'',''htar'',''har'',''ar''] >>> >>> sorted(x) [''ar'', ''har'', ''htar'', ''kar''] >>> >>> sorted(x,cmp=customsort) [''kar'', ''htar'', ''har'', ''ar'']

Porque, en mi idioma, las consonantes vienen con este orden

"k","kh",....,"ht",..."h",...,"a"

Pero en Python 3.x , parece que no pude pasar la palabra clave cmp

>>> sorted(x,cmp=customsort) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: ''cmp'' is an invalid keyword argument for this function

¿Hay alguna alternativa o debo escribir mi propia función ordenada también?

Nota: simplifiqué usando "k", "kh", etc. Los caracteres reales son Unicodes y aún más complicado, a veces hay vocales antes y después de las consonantes, he hecho una función de comparación personalizada, entonces esa parte está bien. Solo el problema es que no pude pasar mi función de comparación personalizada a ordenada o clasificada


En lugar de un customsort (), necesita una función que traduzca cada palabra en algo que Python ya sepa cómo ordenar. Por ejemplo, podría traducir cada palabra a una lista de números donde cada número representa dónde aparece cada letra en su alfabeto. Algo como esto:

my_alphabet = [''a'', ''b'', ''c''] def custom_key(word): numbers = [] for letter in word: numbers.append(my_alphabet.index(letter)) return numbers x=[''cbaba'', ''ababa'', ''bbaa''] x.sort(key=custom_key)

Dado que su lenguaje incluye letras de caracteres múltiples, su función custom_key obviamente tendrá que ser más complicada. Sin embargo, eso debería darte la idea general.


No sé si esto ayudará, pero puede consultar el módulo de locale . Parece que puede establecer la configuración regional en su idioma y usar locale.strcoll para comparar cadenas utilizando las reglas de clasificación de su idioma.


Use el argumento key (y siga la recipe sobre cómo convertir su antigua función cmp a una función key ).


Use el argumento key en su lugar. Toma una función que toma el valor que se procesa y devuelve un valor único que proporciona la clave que se usará para ordenar.

sorted(x, key=somekeyfunc)


Use la palabra key y functools.cmp_to_key para transformar su función de comparación:

sorted(x, key=functools.cmp_to_key(customsort))