本文默认你对Sorted已经有了初步的了解。
Sorted在python2里是传入cmp(compare)函数作为排序规则函数,python3里面把cmp函数wrap成了key函数,这样会更方便。
而在Python3中移除了cmp内建函数,sorted函数也没有了cmp这个关键字参数,但可以调用functools模块中的cmp_to_key来对自定义的cmp函数进行包装,然后就能赋值给sorted函数的关键字参数key,来间接实现Python2中cmp函数用于排序的效果。
cmp_to_key是在python3中使用的,其实就是python2中的cmp函数。
以下是cmp_to_key的具体排序规则:
cmp_to_key返回值小于零则交换值,大于或等于零不变。以下是具体实例
我们先看一下升序实例:
def cmp_key(lolo1, lolo2):
if lolo1 < lolo2:
return-1
elif lolo1 > lolo2:
return 1
else:
return 0
import functools
a=[5, 2, 3, 1, 4]
sorted(a, key=functools.cmp_to_key(cmp_key))
print(a)
#
[1, 2, 3, 4, 5]
下面是降序实例:
def cmp_key(lolo1, lolo2):
if lolo1 < lolo2:
return 1
elif lolo1 > lolo2:
return -1
else:
return 0
import functools
a=[5, 2, 3, 1, 4]
sorted(a, key=functools.cmp_to_key(cmp_key))
print(a)
#
[5, 4, 3, 2, 1]
这个时候就有聪明的小伙伴想到有没有更简便的表达方式呢!我觉得是有的
比如上面代码的排序规则我就可以写成
def cmp_key(lolo1, lolo2):
return lolo2-lolo1
import functools
a=[5, 2, 3, 1, 4]
sorted(a, key=functools.cmp_to_key(cmp_key))
print(a)
#
[5, 4, 3, 2, 1]
就行了
当然,我们还可以使用lambda表达式让他更加简单
请看代码喽
import functools
a=[5, 1, 4, 2, 3]
sorted(a, key=functools.cmp_to_key(lambda lolo1,lolo2: lolo1 - lolo2))
print(a)
#
[5, 4, 3, 2, 1]
当然,lambad表达式也可以这么用(附加内容)
举个例子:
我要排c字典的键值,字典的键用一个字母或数字表示,"1" 的 ASCII 码为 49,大于 1,排序时 1 在前,"1" 在后。其它的字符同理。
d=sorted(c.items(),key=lambda c: ord(c[0]) if type(c[0])==str else c[0])
这是我的一些看法,本人愚钝,欢迎指正。
谢谢阅读!