2024-04-29 04:17:31 发布
网友
我不知道如何在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)))
谢谢。
您提出的这个“比较”函数是不一致的:它应该提供一个确定的(确定性的)顺序,这意味着,如果您更改列表中元素的顺序并运行sorted,您应该得到相同的结果!
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
关于您在注释中提出的问题,key接受一个只接受一个参数的函数,并返回“它有多大”的“度量”。最简单的例子是比较数字,在这种情况下,您的关键函数可以是:lambda x: x。对于任何数字,lambda表达式都将返回自身,而现在的比较是微不足道的!
lambda x: x
修改示例:
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]
您提出的这个“比较”函数是不一致的:它应该提供一个确定的(确定性的)顺序,这意味着,如果您更改列表中元素的顺序并运行
sorted
,您应该得到相同的结果!在您的示例中,元素的顺序影响排序:
这意味着你的“比较”功能不一致。首先提供良好的排序函数,然后将其转换为
key
函数应该不是很困难。关于您在注释中提出的问题,
key
接受一个只接受一个参数的函数,并返回“它有多大”的“度量”。最简单的例子是比较数字,在这种情况下,您的关键函数可以是:lambda x: x
。对于任何数字,lambda表达式都将返回自身,而现在的比较是微不足道的!修改示例:
上面的一个简短版本是:
相关问题 更多 >
编程相关推荐