我不确定如何在Python 3中编写比较器,因为cmp参数已被删除。考虑到Python 3中的以下代码,如何仅使用密钥重写比较器?
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)))
感谢。
答案 0 :(得分:2)
这"比较"你提出的函数是不一致的:它应该提供一个明确的(确定性的)顺序,这意味着,如果你改变列表中元素的顺序并运行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]