cmp_to_key的使用
因python3的sorted函数不再支持比较函数cmp,只能通过functools中的cmp_to_key传给key,实现python2中sorted函数的cmp参数的功能
首先,我们知道list.sort() 和 sorted() 都有一个 key 形参用来指定在进行比较前要在每个列表元素上调用的函数。
例如
# 不区分大小写排序
print(sorted("This is a test string from Andrew".split(), key=str.lower))
输出:['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
l = [(9, 4), (2, 10), (4, 3), (3, 6),(9, 2)]
print(sorted(l,key=lambda x:x[0]))
print(sorted(l,key=lambda x:x[1]))
输出:
[(2, 10), (3, 6), (4, 3), (9, 4), (9, 2)]
[(9, 2), (4, 3), (9, 4), (3, 6), (2, 10)]
但这只能进行单个元素的比较。
比如我们要将上述列表,按元素中第一个数逆序排列,若第一个数相等,按第二个数的顺序排列。这就用到了cmp_to_key!
它在list中的工作机制就是将列表中的元素去两两比较,当cmp返回是正数时 交换两元素
a = [(9, 4), (2, 10), (4, 3), (3, 6),(9, 2)]
def cmp(x,y):
if x[0] < y[0]:
return 1
elif x[0] > y[0]:
return -1
else:
if x[1] > y[1]:
return 1
else:
return -1
print(sorted(a,key=cmp_to_key(cmp)))
输出:
[(9, 2), (9, 4), (4, 3), (3, 6), (2, 10)]