Ответ 1
Используйте key
аргумент (и следуйте рецепту о том, как преобразовать вашу старую cmp
в key
функцию).
functools
есть функция cmp_to_key
упомянутая на docs.python.org/3.6/library/functools.html#functools.cmp_to_key
В Python 2.x я могу передать пользовательскую функцию для отсортированных и .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" и т.д. Фактические символы - это Юникоды и еще более сложные, иногда гласные идут до и после согласных, я сделал пользовательскую функцию сравнения, поэтому эта часть в порядке. Только проблема в том, что я не смог передать свою пользовательскую функцию сравнения для сортировки или .sort
Используйте key
аргумент (и следуйте рецепту о том, как преобразовать вашу старую cmp
в key
функцию).
functools
есть функция cmp_to_key
упомянутая на docs.python.org/3.6/library/functools.html#functools.cmp_to_key
Используйте ключевое слово key
и functools.cmp_to_key, чтобы преобразовать функцию сравнения:
sorted(x, key=functools.cmp_to_key(customsort))
Вместо customort() вам нужна функция, которая переводит каждое слово во что-то, что Python уже знает, как сортировать. Например, вы можете перевести каждое слово в список чисел, где каждое число обозначает, где каждая буква происходит в вашем алфавите. Что-то вроде этого:
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)
Так как ваш язык содержит многосимвольные буквы, ваша функция custom_key, очевидно, должна быть более сложной. Это должно дать вам общую идею.
Я не знаю, поможет ли это, но вы можете проверить модуль locale
. Похоже, вы можете установить языковой стандарт на свой язык и использовать locale.strcoll
для сравнения строк с использованием правил сортировки по языку.
Полный пример лямбда-кода на python3 cmp_to_key:
from functools import cmp_to_key
nums = [28, 50, 17, 12, 121]
nums.sort(key=cmp_to_key(lambda x, y: 1 if str(x)+str(y) < str(y)+str(x) else -1))
сравнить с обычной сортировкой объектов:
class NumStr:
def __init__(self, v):
self.v = v
def __lt__(self, other):
return self.v + other.v < other.v + self.v
A = ["12", "121"]
A.sort()
Вместо этого используйте аргумент key
. Он принимает функцию, которая принимает обрабатываемое значение и возвращает одно значение, предоставляющее ключ для сортировки.
sorted(x, key=somekeyfunc)