YOU*_*YOU 85 python sorting python-3.x
在Python 2.x中,我可以将自定义函数传递给sorted和.sort函数
>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>>
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']
Run Code Online (Sandbox Code Playgroud)
因为,在我的语言中,配偶带有这个命令
"k","kh",....,"ht",..."h",...,"a"
Run Code Online (Sandbox Code Playgroud)
但在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
Run Code Online (Sandbox Code Playgroud)
有没有其他选择,还是我应该编写自己的排序函数?
注意:我通过使用"k","kh"等进行了简化.实际字符是Unicodes甚至更复杂,有时元组前后有元音,我已经完成了自定义比较功能,所以那部分还可以.唯一的问题是我无法将自定义比较函数传递给sorted或.sort
akn*_*ds1 52
使用key关键字和functools.cmp_to_key转换比较函数:
sorted(x, key=functools.cmp_to_key(customsort))
Run Code Online (Sandbox Code Playgroud)
Tim*_*ker 42
使用key参数(并按照配方上如何将旧的转换cmp功能的key功能).
functools具有docs.python.org/3.6/library/functools.html#functools.cmp_to_key中cmp_to_key提到的功能
Cha*_* 木匠 17
一个完整的 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))
Run Code Online (Sandbox Code Playgroud)
比较常见的对象排序:
class NumStr:
def __init__(self, v):
self.v = v
def __lt__(self, other):
return self.v + other.v < other.v + self.v
A = [NumStr("12"), NumStr("121")]
A.sort()
print(A[0].v, A[1].v)
A = [obj.v for obj in A]
print(A)
Run Code Online (Sandbox Code Playgroud)
Dan*_*ach 14
您需要一个函数将每个单词转换为Python已经知道如何排序的函数,而不是一个customort().例如,您可以将每个单词翻译成数字列表,其中每个数字代表字母表中每个字母的出现位置.像这样的东西:
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)
Run Code Online (Sandbox Code Playgroud)
由于您的语言包含多字符字母,因此您的custom_key函数显然需要更复杂.那应该会给你一般的想法.