使用自定义比较的排序键功能

big*_*ose 5 python sorting comparison functional-programming python-3.x

Python 3 删除了cmp排序函数的参数

builtin.sorted()并且list.sort()不再接受cmp提供比较功能的参数。请改用key参数。

这对于仅通过检查序列中的单个项目即可确定的订单(例如key=str.lower)很好。但是,必须具有两个要检查的项目才能确定其订购的定制订购呢?

$ python2
Python 2.7.12+ (default, Sep  1 2016, 20:27:38)
[…]

>>> digits = ['3', '30', '34', '32', '9', '5']
>>> sorted(
...         digits,
...         cmp=(lambda a, b: cmp(a+b, b+a)),
...         reverse=True)
['9', '5', '34', '3', '32', '30']
Run Code Online (Sandbox Code Playgroud)

那两个参数cmp函数不能用一个参数key函数代替吗?

big*_*ose 6

使用functools.cmp_to_key助手。

>>> import functools
>>> digits = ['3', '30', '34', '32', '9', '5']
>>> sorted(
...         digits,
...         key=functools.cmp_to_key(lambda a, b: cmp(a+b, b+a)),
...         reverse=True)
['9', '5', '34', '3', '32', '30']
Run Code Online (Sandbox Code Playgroud)

Python 3中排序函数采用一个“关键”参数

key指定一个参数的功能,该参数用于从每个列表元素中提取比较键:key=str.lower。默认值为None(直接比较元素)。

functools.cmp_to_key帮助程序旨在帮助您过渡到该样式

functools.cmp_to_key(功能)

将旧式比较功能转换为键功能。[…]该函数主要用作从Python 2转换而来的程序的转换工具,该程序支持使用比较函数。

这适用于最新的Python 2和Python 3。

通过创建一个将要进行比较的项目的键函数并返回一个自定义对象来完成此技巧,该对象知道如何根据比较函数的指定进行自我比较。

>>> key_func = functools.cmp_to_key(lambda a, b: cmp(a+b, b+a))
>>> key_func("32")
<functools.K object at 0x7f6781ce0980>
>>> key_func("32") < key_func("5")
True
Run Code Online (Sandbox Code Playgroud)

有关此技巧和其他技巧,请参见“ 排序方法”