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

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提到的功能

  • 我做了一些基准测试,看起来比直接传递自定义C比较功能慢4倍. (4认同)
  • functools在标准库中有一个cmp_to_key函数:https://docs.python.org/3.6/library/functools.html (4认同)
  • (只是查看了您的个人资料)您的公司阻止访问Google和StackOverflow?他们有多愚蠢?但关于你的回答:我对实际的性能下降感兴趣.你能算吗? (2认同)
  • 如果我需要一个 key 函数和一个 cmp 函数怎么办?我想通过每个字典中的自定义键对字典列表进行排序。```sorted_rows = sorted(rows, key=itemgetter('name'), cmp=locale.strxfrm)``` 给出 TypeError: 'cmp' is an invalid keyword argument for this function, in Python 3.2 :( (2认同)

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函数显然需要更复杂.那应该会给你一般的想法.