排序如何在Python 3中使用自定义比较函数?
在Python 2中。x,我可以将自定义函数传递给排序和。排序函数
>>> 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”等简化了。实际字符是Unicode,甚至更复杂,有时辅音前后都有元音,我做了自定义比较功能,所以这部分就可以了。唯一的问题是我无法将自定义比较函数传递给排序或。排序
# 1 楼答案
使用
key
参数(并按照recipe说明如何将旧的cmp
函数转换为key
函数)functools
有一个函数cmp_to_key
在docs.python.org/3.6/library/functools.html#functools.cmp_to_key中提到# 2 楼答案
您需要一个函数来代替customsort(),该函数将每个单词转换为Python已经知道如何排序的内容。例如,您可以将每个单词翻译成数字列表,其中每个数字表示字母表中每个字母出现的位置。大概是这样的:
由于您的语言包含多个字符的字母,您的自定义_键功能显然需要更加复杂。这应该给你一个大概的想法
# 3 楼答案
完整的python3 cmp_to_key lambda示例:
与普通对象排序相比:
# 4 楼答案
我不知道这是否有帮助,但您可以查看
locale
模块。看起来您可以将区域设置设置为您的语言,并使用locale.strcoll
使用您的语言的排序规则来比较字符串# 5 楼答案
使用
key
关键字和functools.cmp_to_key转换比较函数:# 6 楼答案
改用
key
参数。它接受一个函数,该函数接受正在处理的值并返回一个值,该值提供用于排序的键