Nin*_*ner 8 python sorting python-3.x
我不确定如何在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)))
Run Code Online (Sandbox Code Playgroud)
谢谢.
您提出的这个“比较”函数是不一致的:它应该提供明确的(确定性)顺序,这意味着,如果您更改列表中元素的顺序并运行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]
Run Code Online (Sandbox Code Playgroud)
这意味着你的“比较”功能不一致。首先提供良好的排序函数,那么将其转换为函数应该不会很困难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]
Run Code Online (Sandbox Code Playgroud)
上述内容的较短版本是:
l = [50, 2, 1, 9]
print(sorted(l, key=lambda x: x)) # [1, 2, 9, 50]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5349 次 |
| 最近记录: |