如何在Python 3中使用自定义的比较函数?

Python 2.x中 ,我可以将自定义函数传递给sorting函数和.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 

有没有其他的select,或者我应该写我自己的sortingfunction吗?

注意:我使用“k”,“kh”等进行了简化。实际的字符是Unicodes,甚至更复杂,有时元音出现在元音前后,我做了自定义的比较function,所以这个部分是可以的。 只有问题是我无法将自定义比较函数传递给sorting或.sort

使用key参数(并遵循如何将旧的cmp函数转换为key函数的配方 )。

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

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

您不需要使用(),而需要一个将每个单词翻译成Python已经知道如何sorting的function。 例如,您可以将每个单词翻译成一个数字列表,其中每个数字表示每个字母在您的字母表中出现的位置。 像这样的东西:

 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来使用您的语言的sorting规则比较string。

改用key参数。 它需要一个函数来处理正在处理的值,并返回一个给出用于sorting的键的值。

 sorted(x, key=somekeyfunc)