python3 理清sort、sorted、key、lambda、cmp_to_key
1. sort和sorted
sort和sorted区别:
sort是应用在list上的,而sorted可应用于任何可迭代的对象上;
list的sort方法是在原始list上操作,而sorted返回新的list;
sort使用ls.sort(),而sorted使用sorted(ls);
1 | # 例子 |
2. key
sort与sorted的区别在列表上区别主要在使用方法上,功能是一致的,以sorted为例解释其他概念
key形参是一个函数,这个函数只接收一个参数并返回一个用于排序的键,每个元素都会调用一次这个函数生成一个键1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32# 例子1
L1 = ['123','111','1000']
L2 = [[2,3],[5,1],[7,2]]
print(sorted(L))
def fun1(x):
# 用字符串长度进行排序
return len(x)
def fun2(x):
# 用字符串转换成数字大小进行排序
return int(x)
def fun3(x):
# 用第二维进行排序
return x[1]
def fun4(x):
# 用两个维度之和进行排序
return x[0]+x[1]
print(sorted(L1,key=fun1))
print(sorted(L1,key=fun2))
print(sorted(L2,key=fun3))
print(sorted(L2,key=fun4))
输出:
['1000', '111', '123']
['123', '111', '1000']
['111', '123', '1000']
[[5, 1], [7, 2], [2, 3]]
[[2, 3], [5, 1], [7, 2]]
3. lambda
lamda是一个用于生成匿名函数的关键字,像前面的fun1,fun2都是有名称的函数,在某些场景我们并不关心函数名称,只想临时生成一个具有简单功能的匿名函数。
用法:lambda [参数]:[返回值]
将前面的例子用lambda替代可简化代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 例子1
L1 = ['123','111','1000']
L2 = [[2,3],[5,1],[7,2]]
print(sorted(L))
print(sorted(L1,key=lambda x:len(x)))
print(sorted(L1,key=lambda x:int(x)))
print(sorted(L2,key=lambda x:x[1]))
print(sorted(L2,key=lambda x:x[0]+x[1]))
输出:
['1000', '111', '123']
['123', '111', '1000']
['111', '123', '1000']
[[5, 1], [7, 2], [2, 3]]
[[2, 3], [5, 1], [7, 2]]
4. cmp_to_key
前面利用key指定了键值,该键值会进行比较然后排序,假如需要自定义比较方法怎么办呢?那就需要用到cmp_to_key
(注意:只适用于python3)
假设小明对小鸭子,小狗,小猫的喜爱程度为 小狗<小鸭子<小猫
animals = [‘小鸭子’,’小狗’,’小猫’],请用sorted按喜爱程度排序1
2
3
4
5
6
7
8
9
10
11animals = ['小鸭子','小狗','小猫']
def compare(x,y):
if x==y:
return 0
elif (x,y) in [('小狗','小鸭子'),('小狗','小猫'),('小鸭子','小猫')]:
return -1
else:return 1
print(sorted(animals,key=cmp_to_key(compare)))
输出:
['小狗', '小鸭子', '小猫']
这时key还是一个函数,具体函数形式为cmp_to_key([自定义的比较函数])
自定义的比较函数输入为两个待比较的参数,若参数1小于参数2,则返回负数,反之返回正数,相等返回0。
如果这个比较函数可以简单表达出来,也可以用lambda生成一个匿名函数来代替。
上面的例子可能比较简陋,可参看这个例子,剑指 Offer 45. 把数组排成最小的数