按照字典的值value进行排序
.sort()方法只有列表才有,集合,字典,元祖都没有sort()方法。所以对字典进行排序的时候先将字典转化成列表。注意这里转化的时候一定是字典的items(),转化结束之后,每一个键值对是一个元祖,这些元祖就是生成的列表里的元素。sort()方法里有两个参数,一个是reverse,将它设置为True的时候,降序排序。另一个参数key,是一个函数,指定的是以什么元素为比较进行排序。这里使用的是lambda匿名函数,其中x是随意起的名字,指代列表中的每一个元素,这里就是待排序的元祖们。因为这里的元祖是是由字典中键值对转化过来的,x[1]指代的第二个元素,即字典中的value。也就是说以value为比较进行排序。
代码如下:
d = {1: 1000, 4: 250, 2: 750, 3: 500}
print(d) # {1: 1000, 4: 250, 2: 750, 3: 500}
lt = list(d.items())
print(lt) # [(1, 1000), (4, 250), (2, 750), (3, 500)] 键值对转化成了元祖
print(type(lt[0])) #
print(lt[1][1]) # 250 第二个元素的第二个值
# must use keyword argument for key function
# tuple index out of range 注意这里元素从0开始
lt.sort(key=lambda x:x[1],reverse=True) # 按照第二个元素的大小进行排序
print(lt) # [(1, 1000), (2, 750), (3, 500), (4, 250)]
发散:带有优先级的比较
a = [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]
# 按照第二个元素从小到大排序,相同时按第一个元素从大到小排序
a.sort(key=lambda x: (x[1], -x[0]))
# 中间3个的第二个元素相同,第一个元素是从大到小
print(a) # [(27, 35), (85, 55), (74, 55), (38, 55), (36, 58)]
# 逆序,相当于先按第二个元素从大到小,再按第一个元素从小到大
a.sort(key=lambda x: (x[1], -x[0]), reverse=True)
# 中间3个的第二个元素相同,第一个元素是从小到大
print(a) # [(36, 58), (38, 55), (74, 55), (85, 55), (27, 35)]
这里的lambda函数,x是参数,代表列表当中的每一个元素。而匿名函数的函数体是要比较的内容。lambda的主体是一个表达式,而不是一个代码块。当有优先级比较的时候,注意lambda的表达式是一个tuple,也就是说按照这个tuple进行比较。这个时候对tuple的比较,和字符串的比较相似,先比较tuple当中的第一个元素,如果相同再比较第二个,以此类推。此外默认是按照从小到大的顺序排序,添加负号可以改为这个元素的比较是从大到小。因为两个负数相比,绝对值小的值更大。
不使用lambda函数:
key参数就是一个函数,使用普通的函数或者lambda函数都可以。当函数作为参数的时候不加小括号()。
a = [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]
def cmp(x):
return x[0]
a.sort(key=cmp)
print(a)
sorted()和list.sort()的区别
a = [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]
def cmp(x):
return x[0]
# a.sort(key=cmp)
b = sorted(a, key=cmp)
print(a) # [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]
print(b) # [(27, 35), (36, 58), (38, 55), (74, 55), (85, 55)]
可以看到内置函数sorted()在执行之后返回一个新的列表,而list.sort()则是本地操作,会修改要排序的列表。list.sort()只有列表可以使用这个方法,sorted可以对更多的组合类型进行排序。
a1 = {2,3,4,5,6,1,2} # set
b1 = sorted(a1) # list
print(b1) # [1, 2, 3, 4, 5, 6]
a2 = (2,3,4,5,6,1) # tuple
b1 = sorted(a2) # tuple
print(a2) # (2, 3, 4, 5, 6, 1)
a3 = {32:2,76:4,13:6}
b3_1 = sorted(a3)
b3_2 = sorted(a3.values())
b3_3 = sorted(a3.items())
print(b3_1) # [13, 32, 76]
print(b3_2) # [2, 4, 6]
print(b3_3) # [(13, 6), (32, 2), (76, 4)]
a4 = [(1,2),(1,2),(1,1)]
b4 = sorted(a4)
print(b4) # [(1, 1), (1, 2), (1, 2)]
numpy库里的argsort()函数,返回从大到小的索引值
import numpy as np
arr = np.array([3,1,4,2])
t = np.argsort(arr)
print(t) # [1 3 0 2]