如何在 Python 3 中使用自定义比较函数?
- 2025-03-18 08:54:00
- admin 原创
- 43
问题描述:
在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”等进行了简化。实际字符是 Unicode,甚至更复杂,有时元音在辅音之前和之后,我已经完成了自定义比较函数,所以这部分没问题。唯一的问题是我无法将我的自定义比较函数传递给 sorted 或 .sort
解决方案 1:
使用key
关键字和functools.cmp_to_key来转换你的比较函数:
sorted(x, key=functools.cmp_to_key(customsort))
解决方案 2:
使用key
参数(并按照如何将旧函数转换为函数的说明)。cmp
`key`
functools
有一个在docs.python.org/3.6/library/functools.html#functools.cmp_to_keycmp_to_key
中提到的函数
解决方案 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)
解决方案 4:
您不需要 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)
由于您的语言包含多字符字母,您的 custom_key 函数显然需要更复杂。不过这应该能让您有个大致的了解。
解决方案 5:
我不知道这是否有帮助,但你可以查看该locale
模块。看起来你可以将区域设置为你的语言,并使用locale.strcoll
你的语言的排序规则来比较字符串。
解决方案 6:
请使用key
参数。它接受一个函数,该函数接受正在处理的值并返回一个值,该值给出了用于排序的键。
sorted(x, key=somekeyfunc)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD