W Pythonie 2.x mogłem przekazać funkcję niestandardową do funkcji sortowanych i .sort
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Ponieważ w moim języku w tej kolejności występują spółgłoski
"k","kh",....,"ht",..."h",...,"a"
Ale w Pythonie 3.x wygląda na to, że nie mogłem przekazać cmp
słowa kluczowego
>>> 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
Czy są jakieś alternatywy, czy też powinienem napisać własną posortowaną funkcję?
Uwaga: uprościłem, używając "k", "kh" itp. Rzeczywiste znaki to Unicody i jeszcze bardziej skomplikowane, czasami przed i po spółgłoskach pojawiają się samogłoski, zrobiłem niestandardową funkcję porównywania, więc ta część jest w porządku. Jedynym problemem jest to, że nie mogłem przekazać mojej niestandardowej funkcji porównania do sortowania lub .sort
sorted(x)
?Odpowiedzi:
Użyj
key
argumentu (i postępuj zgodnie z przepisem, jak przekonwertować starącmp
funkcję nakey
funkcję).functools
ma funkcjęcmp_to_key
wymienioną na docs.python.org/3.6/library/functools.html#functools.cmp_to_keyźródło
< > =
pośrednikowi, ponieważ moje oryginalne niestandardowe sortowanie jest napisane w C, miało około 1 / 2x prędkość domyślne sortowanie.timeit
to?sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)
daje TypeError: 'cmp' jest nieprawidłowym argumentem słowa kluczowego dla tej funkcji, w Pythonie 3.2 :(Użyj
key
słowa kluczowego i functools.cmp_to_key, aby przekształcić funkcję porównania:źródło
Zamiast Customort () potrzebujesz funkcji, która tłumaczy każde słowo na coś, co Python już wie, jak posortować. Na przykład, możesz przetłumaczyć każde słowo na listę liczb, gdzie każda cyfra reprezentuje miejsce, w którym każda litera występuje w Twoim alfabecie. Coś takiego:
Ponieważ twój język zawiera wieloznakowe litery, twoja funkcja custom_key będzie oczywiście musiała być bardziej skomplikowana. To jednak powinno dać ci ogólny pomysł.
źródło
Kompletny przykład lambda cmp_to_key w Pythonie3:
w porównaniu do zwykłego sortowania obiektów:
źródło
Nie wiem, czy to pomoże, ale możesz sprawdzić
locale
moduł. Wygląda na to, że możesz ustawić ustawienia regionalne na swój język i użyć golocale.strcoll
do porównania ciągów znaków przy użyciu reguł sortowania w Twoim języku.źródło
key
Zamiast tego użyj argumentu. Pobiera funkcję, która przyjmuje przetwarzaną wartość i zwraca pojedynczą wartość, podając klucz do sortowania według.źródło
TypeError: customsort() takes exactly 2 positional arguments (1 given)