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

时间:2010-03-28 05:04:35

标签: 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']

因为,在我的语言中,这个命令附带了

"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

6 个答案:

答案 0 :(得分:45)

使用key关键字和functools.cmp_to_key转换比较功能:

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

答案 1 :(得分:33)

使用key参数(并按照recipe关于如何将旧的cmp函数转换为key函数的方式。)

functoolsdocs.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)