En Python 2.x , podría pasar una función personalizada a funciones ordenadas y .sort
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Porque, en mi idioma, los consonentes vienen con este orden
"k","kh",....,"ht",..."h",...,"a"
Pero en Python 3.x , parece que no pude pasar la cmp
palabra clave
>>> 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 debería escribir mi propia función ordenada también?
Nota: simplifiqué usando "k", "kh", etc. Los caracteres reales son Unicodes e incluso más complicados, a veces hay vocales que vienen antes y después de los consonents, hice una función de comparación personalizada, así que esa parte está bien. El único problema es que no pude pasar mi función de comparación personalizada a sorted o .sort
sorted(x)
?Respuestas:
Utilice el
key
argumento (y siga la receta sobre cómo convertir su antiguacmp
función en unakey
función).functools
tiene una funcióncmp_to_key
mencionada en docs.python.org/3.6/library/functools.html#functools.cmp_to_keyfuente
< > =
al intermediario, ya que mi clasificación personalizada original está escrita en C, tenía una velocidad de alrededor de 1 / 2x clasificación predeterminada.timeit
hacerlo?sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)
da TypeError: 'cmp' es un argumento de palabra clave no válido para esta función, en Python 3.2 :(Utilice la
key
palabra clave y functools.cmp_to_key para transformar su función de comparación:fuente
En lugar de customsort (), necesita una función que traduzca cada palabra en algo que Python ya sepa cómo ordenar. Por ejemplo, puede traducir cada palabra en una lista de números donde cada número representa el lugar donde aparece cada letra en su alfabeto. Algo como esto:
Dado que su idioma incluye letras de varios caracteres, su función custom_key obviamente tendrá que ser más complicada. Sin embargo, eso debería darte una idea general.
fuente
Un ejemplo completo de python3 cmp_to_key lambda:
comparar con la clasificación de objetos comunes:
fuente
No sé si esto ayudará, pero puede consultar el
locale
módulo. Parece que puede establecer la configuración regional en su idioma y usarlalocale.strcoll
para comparar cadenas usando las reglas de clasificación de su idioma.fuente
En su lugar, utilice el
key
argumento. Toma una función que toma el valor que se está procesando y devuelve un valor único que proporciona la clave que se utilizará para ordenar.fuente
TypeError: customsort() takes exactly 2 positional arguments (1 given)