¿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))