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

En Python 2.x , podría pasar la función personalizada a las 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, 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 "", line 1, in  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é utilizando “k”, “kh”, etc. Los caracteres reales son Unicodes e incluso más complicados, a veces hay vocales antes y después de las consonantes, he hecho 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 ordenada o .sort

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

functools tiene una función cmp_to_key mencionada en docs.python.org/3.6/library/functools.html#functools.cmp_to_key

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

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

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 en una lista de números donde cada número representa donde 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 idioma incluye letras de varios caracteres, su función custom_key obviamente tendrá que ser más complicada. Eso debería darte una idea general.

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

Utilice el argumento key en su lugar. Toma una función que toma el valor que se está procesando y devuelve un solo valor que proporciona la clave para usar para ordenar.

 sorted(x, key=somekeyfunc)