如何在Python3中使用自定义比较函数?

2024-04-30 05:29:42 发布

您现在位置:Python中文网/ 问答频道 /正文

在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


Tags: 函数语言顺序关键字sorthtarsorted
3条回答

使用key参数(并按照recipe说明如何将旧的cmp函数转换为key函数)。

functools具有在docs.python.org/3.6/library/functools.html#functools.cmp_to_key提到的功能cmp_to_key

使用key关键字和functools.cmp_to_key转换比较函数:

sorted(x, key=functools.cmp_to_key(customsort))

您需要一个函数来将每个单词转换成Python已经知道如何排序的内容,而不是customsort()。例如,您可以将每个单词翻译成一个数字列表,其中每个数字表示字母表中每个字母的位置。像这样的:

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)

由于您的语言包含多字符字母,您的自定义键功能显然需要更复杂。不过,这应该给你一个大致的概念。

相关问题 更多 >