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
函数代替吗?
使用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)
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)
有关此技巧和其他技巧,请参见“ 排序方法”。
归档时间: |
|
查看次数: |
1850 次 |
最近记录: |