Dans Python 2.x , je pourrais passer une fonction personnalisée aux fonctions triées et .sort
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Parce que, dans Ma langue, les consonnes sont accompagnées de cet ordre
"k","kh",....,"ht",..."h",...,"a"
Mais dans Python 3.x , il semble que je n'ai pas pu passer le cmp
mot - clé
>>> 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
Existe-t-il des alternatives ou devrais-je aussi écrire ma propre fonction triée?
Remarque: j'ai simplifié en utilisant "k", "kh", etc. Les caractères réels sont des Unicodes et encore plus compliqués, parfois il y a des voyelles qui viennent avant et après les consonnes, j'ai fait une fonction de comparaison personnalisée, donc cette partie est ok. Le seul problème est que je n'ai pas pu passer ma fonction de comparaison personnalisée à trié ou .sort
sorted(x)
?Réponses:
Utilisez l'
key
argument (et suivez la recette pour convertir votre anciennecmp
fonction enkey
fonction).functools
a une fonctioncmp_to_key
mentionnée sur docs.python.org/3.6/library/functools.html#functools.cmp_to_keyla source
< > =
à l'intermédiaire, puisque mon tri personnalisé d'origine est écrit en C, il avait une vitesse d'environ 1 / 2x de tri par défaut.timeit
?sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)
donne TypeError: 'cmp' est un argument mot-clé non valide pour cette fonction, en Python 3.2 :(Utilisez le
key
mot - clé et functools.cmp_to_key pour transformer votre fonction de comparaison:la source
Au lieu d'un customsort (), vous avez besoin d'une fonction qui traduit chaque mot en quelque chose que Python sait déjà trier. Par exemple, vous pouvez traduire chaque mot en une liste de nombres où chaque chiffre représente l'emplacement de chaque lettre dans votre alphabet. Quelque chose comme ça:
Puisque votre langue inclut des lettres à plusieurs caractères, votre fonction custom_key devra évidemment être plus compliquée. Cela devrait cependant vous donner une idée générale.
la source
Un exemple lambda complet de python3 cmp_to_key:
comparer au tri d'objets commun:
la source
Je ne sais pas si cela aidera, mais vous pouvez consulter le
locale
module. Il semble que vous puissiez définir les paramètres régionaux sur votre langue et l'utiliserlocale.strcoll
pour comparer des chaînes en utilisant les règles de tri de votre langue.la source
Utilisez
key
plutôt l' argument. Il prend une fonction qui prend la valeur en cours de traitement et renvoie une valeur unique donnant la clé à utiliser pour trier.la source
TypeError: customsort() takes exactly 2 positional arguments (1 given)