在Python 3中编写comparator作为键进行排序的正确方法是什么?

2024-04-29 04:17:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何在Python 3中编写一个比较器,因为cmp参数被删除了。考虑到Python 3中的以下代码,如何使用only key重写比较器?

import functools

def my_cmp(x, y):
    return x*5-y*2

l = [50, 2, 1, 9]
print(sorted(l, key=functools.cmp_to_key(my_cmp)))

谢谢。


Tags: tokey代码importonly参数returnmy
1条回答
网友
1楼 · 发布于 2024-04-29 04:17:31

您提出的这个“比较”函数是不一致的:它应该提供一个确定的(确定性的)顺序,这意味着,如果您更改列表中元素的顺序并运行sorted,您应该得到相同的结果!

在您的示例中,元素的顺序影响排序:

import functools

def my_cmp(x, y):
    return x*5-y*2


l = [50, 2, 1, 9]
print(sorted(l, key=functools.cmp_to_key(my_cmp))) # [2, 1, 9, 50]

l = [50, 1, 2, 9]
print(sorted(l, key=functools.cmp_to_key(my_cmp))) # [1, 2, 9, 50]

这意味着你的“比较”功能不一致。首先提供良好的排序函数,然后将其转换为key函数应该不是很困难。


关于您在注释中提出的问题,key接受一个只接受一个参数的函数,并返回“它有多大”的“度量”。最简单的例子是比较数字,在这种情况下,您的关键函数可以是:lambda x: x。对于任何数字,lambda表达式都将返回自身,而现在的比较是微不足道的!

修改示例:

def my_key(x):
    return x    

l = [50, 2, 1, 9]
print(sorted(l, key=my_key)) # [1, 2, 9, 50]

上面的一个简短版本是:

l = [50, 2, 1, 9]
print(sorted(l, key=lambda x: x)) # [1, 2, 9, 50]

相关问题 更多 >