Sorted复杂排序—cmp_to_key

   本文默认你对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])

这是我的一些看法,本人愚钝,欢迎指正。

谢谢阅读!

你可能感兴趣的:(python,开发语言)