Как использовать пользовательскую функцию сравнения в Python 3?

В 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", и т.д. Фактическими символами является Unicodes и еще более сложный, иногда существуют гласные, прибывает, прежде и после согласных, я сделал пользовательскую функцию сравнения, Так, чтобы часть была в порядке. Только проблема, я не мог передать свою пользовательскую функцию сравнения отсортированному или .sort

84
задан martineau 17 October 2016 в 07:09
поделиться

4 ответа

Используйте аргумент ключа (и следуйте рецепту о том, как преобразовать старый cmp на функцию клавиши ).

functools имеет функцию cmp_to_key , упомянутую в docs.python.org/3.6/library/functools.html#functools.cmp_to_key

42
ответ дан 24 November 2019 в 08:38
поделиться

Вместо этого используйте аргумент ключа . Он принимает функцию, которая принимает обрабатываемое значение и возвращает единственное значение, дающее ключ для использования для сортировки.

sorted(x, key=somekeyfunc)
-1
ответ дан 24 November 2019 в 08:38
поделиться

Не знаю, поможет ли это, но вы можете проверить модуль locale . Похоже, вы можете установить локаль на свой язык и использовать locale.strcoll для сравнения строк с использованием правил сортировки вашего языка.

4
ответ дан 24 November 2019 в 08:38
поделиться

Вместо customsort() вам нужна функция, которая переводит каждое слово во что-то, что 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, очевидно, должна быть более сложной. Однако это должно дать вам общую идею.

14
ответ дан 24 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: