В Python 2.x я мог передать пользовательскую функцию функциям sorted и .sort.
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Потому что, на Моем языке, коннекторы идут с таким порядком
"k","kh",....,"ht",..."h",...,"a"
Но в Python 3.x похоже, что я не мог передать cmp
ключевое слово
>>> 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
Есть ли альтернативы, или я должен написать свою собственную отсортированную функцию?
Примечание: я упростил, используя «k», «kh» и т. Д. Фактические символы - это юникоды и даже более сложные, иногда гласные идут до и после компонентов, я сделал специальную функцию сравнения, так что эта часть в порядке. Только проблема в том, что я не смог передать свою пользовательскую функцию сравнения в sorted или .sort
sorted(x)
?Ответы:
Используйте
key
аргумент (и следуйте рецепту того, как преобразовать старуюcmp
функцию вkey
функцию).functools
имеет функцию,cmp_to_key
упомянутую на docs.python.org/3.6/library/functools.html#functools.cmp_to_keyисточник
< > =
среднему человеку, поскольку моя исходная настраиваемая сортировка написана на C, она имела скорость примерно в 1/2 раза выше сортировка по умолчанию.timeit
это?sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)
выдает TypeError: 'cmp' является недопустимым аргументом ключевого слова для этой функции в Python 3.2 :(Используйте
key
ключевое слово и functools.cmp_to_key для преобразования вашей функции сравнения:источник
Вместо customort () вам нужна функция, которая переводит каждое слово в то, что Python уже умеет сортировать. Например, вы можете перевести каждое слово в список чисел, где каждое число означает место каждой буквы в вашем алфавите. Что-то вроде этого:
Поскольку ваш язык включает в себя многосимвольные буквы, ваша функция custom_key, очевидно, должна быть более сложной. Это должно дать вам общее представление.
источник
Полный пример лямбда-выражения cmp_to_key на python3:
сравните с обычной сортировкой объектов:
источник
Не знаю, поможет ли это, но вы можете проверить
locale
модуль. Похоже, вы можете установить языковой стандарт на свой язык и использовать егоlocale.strcoll
для сравнения строк, используя правила сортировки вашего языка.источник
key
Вместо этого используйте аргумент. Он принимает функцию, которая принимает обрабатываемое значение и возвращает одно значение, дающее ключ для использования для сортировки.источник
TypeError: customsort() takes exactly 2 positional arguments (1 given)