有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

排序如何在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,甚至更复杂,有时辅音前后都有元音,我做了自定义比较功能,所以这部分就可以了。唯一的问题是我无法将自定义比较函数传递给排序或。排序


共 (6) 个答案

  1. # 2 楼答案

    您需要一个函数来代替customsort(),该函数将每个单词转换为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)
    

    由于您的语言包含多个字符的字母,您的自定义_键功能显然需要更加复杂。这应该给你一个大概的想法

  2. # 3 楼答案

    完整的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 = [NumStr("12"), NumStr("121")]
    A.sort()
    print(A[0].v, A[1].v)
    
    A = [obj.v for obj in A]
    print(A)
    
  3. # 4 楼答案

    我不知道这是否有帮助,但您可以查看locale模块。看起来您可以将区域设置设置为您的语言,并使用locale.strcoll使用您的语言的排序规则来比较字符串

  4. # 5 楼答案

    使用key关键字和functools.cmp_to_key转换比较函数:

    sorted(x, key=functools.cmp_to_key(customsort))
    
  5. # 6 楼答案

    改用key参数。它接受一个函数,该函数接受正在处理的值并返回一个值,该值提供用于排序的键

    sorted(x, key=somekeyfunc)