在 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”等进行了简化。实际字符是Unicodes甚至更复杂,有时元组前后有元音,我做了自定义比较功能,所以那部分还可以。只有问题是我无法将自定义比较函数传递给sorted或.sort
答案 0 :(得分:45)
使用key
关键字和functools.cmp_to_key转换比较功能:
sorted(x, key=functools.cmp_to_key(customsort))
答案 1 :(得分:33)
使用key
参数(并按照recipe关于如何将旧的cmp
函数转换为key
函数的方式。)
functools
在docs.python.org/3.6/library/functools.html#functools.cmp_to_key
cmp_to_key
函数
答案 2 :(得分:13)
您需要一个函数将每个单词转换为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函数显然需要更复杂。那应该会给你一般的想法。
答案 3 :(得分:4)
我不知道这是否有帮助,但您可以查看locale
模块。看起来您可以将语言环境设置为您的语言,并使用locale.strcoll
使用您的语言排序规则来比较字符串。
答案 4 :(得分:0)
完整的python3 cmp_to_key lambda示例:
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()
答案 5 :(得分:-1)
请改用key
参数。它需要一个函数来获取正在处理的值并返回一个值,该值给出了用于排序的键。
sorted(x, key=somekeyfunc)