No Python 2.x , eu poderia passar funções personalizadas para funções ordenadas e classificadas
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Porque, na Minha língua, as consoantes vêm com esta ordem
"k","kh",....,"ht",..."h",...,"a"
Mas no Python 3.x , parece que não consegui passar a cmp
palavra-chave
>>> 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 alguma alternativa ou devo escrever minha própria função classificada também?
Nota: simplifiquei usando "k", "kh", etc. Os caracteres reais são Unicodes e ainda mais complicados, às vezes há vogais que vêm antes e depois das consoantes, fiz a função de comparação personalizada, então essa parte está ok. O único problema é que não consegui passar minha função de comparação personalizada para classificado ou .sort
python
sorting
python-3.x
VOCÊS
fonte
fonte
sorted(x)
?Respostas:
Use o
key
argumento (e siga a receita sobre como converter suacmp
função antiga em umakey
função).functools
tem uma funçãocmp_to_key
mencionada em docs.python.org/3.6/library/functools.html#functools.cmp_to_keyfonte
< > =
para intermediários, já que minha classificação personalizada original é escrita em C, tinha cerca de 1 / 2x a velocidade de classificação padrão.timeit
?sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)
fornece TypeError: 'cmp' é um argumento de palavra-chave inválido para esta função, em Python 3.2 :(Use a
key
palavra - chave e functools.cmp_to_key para transformar sua função de comparação:fonte
Em vez de Customizar (), você precisa de uma função que traduza cada palavra em algo que Python já sabe como classificar. Por exemplo, você pode traduzir cada palavra em uma lista de números onde cada número representa onde cada letra ocorre em seu alfabeto. Algo assim:
Como seu idioma inclui letras de vários caracteres, sua função custom_key obviamente precisará ser mais complicada. Isso deve lhe dar uma idéia geral.
fonte
Um exemplo completo de python3 cmp_to_key lambda:
compare à classificação de objetos comuns:
fonte
Não sei se isso vai ajudar, mas você pode conferir o
locale
módulo. Parece que você pode definir o local para o seu idioma e usarlocale.strcoll
para comparar strings usando as regras de classificação do seu idioma.fonte
Em
key
vez disso, use o argumento. Ele recebe uma função que obtém o valor sendo processado e retorna um único valor fornecendo a chave a ser usada para classificar.fonte
TypeError: customsort() takes exactly 2 positional arguments (1 given)