说到排序,首先想到的便是内置函数 sorted 函数,内置函数要比我们自己写的排序效率要高,但是直策应用sorted函数对字典排序的时候,它是根据字典的键的ASCII编码顺序进行排序的,要想让字典根据值的大小来排序,可以参考下面的方案。
先看一下 sorted 函数的用法吧
sorted函数的格式:sorted(iterable,key,reverse),sorted有iterable,key,reverse三个参数。

iterable 表示可以迭代的工具,例如可以是dict.items()、dict.keys()等。
key 是一个函数,常日利用利用lambda匿名函数来实现,用来选取参与比较的元素。
reverse 用来指定按倒序还是顺序排序,reverse=True是倒序,reverse=False是顺序,默认reverse=False。
方案一:将字典转换为元组,再利用 sorted 函数进行排序
来一个烂大街的案例,学生的学习成绩,详细排序办法如下:
data = { 'lilei': 98, 'hanmeimei': 87, 'zhangsan': 65, 'laowang': 89 }# 1,利用列表解析转为元组d1 = [(v, k) for k, v in data.items()]print(d1) # 结果 [(98, 'lilei'), (87, 'hanmeimei'), (65, 'zhangsan'), (89, 'laowang')]res = sorted(d1, reverse= True)print(res) # 结果 [(98, 'lilei'), (89, 'laowang'), (87, 'hanmeimei'), (65, 'zhangsan')]# 2,利用zip函数转为元组d2 = list(zip(data.values(), data.keys()))print(d2) # 结果 [(98, 'lilei'), (87, 'hanmeimei'), (65, 'zhangsan'), (89, 'laowang')]res = sorted(d2, reverse= True)print(res)# 结果 [(98, 'lilei'), (89, 'laowang'), (87, 'hanmeimei'), (65, 'zhangsan')]
那么,能不能直策应用sorted函数对字典的值进行排序呢,我不想转成元组,显然也可以。
方案二:通报sorted函数的key参数指定为字典的值,推举利用
data = { 'lilei': 98, 'hanmeimei': 87, 'zhangsan': 65, 'laowang': 89 }res = sorted(data.items(), key = lambda item: item[1], reverse = True)print(res) # 结果 [('lilei', 98), ('laowang', 89), ('hanmeimei', 87), ('zhangsan', 65)]
按照这种办法就更简洁一点了,只须要一行代码了
方案三:利用operator模块的itemgetter函数
import operatordata = { 'lilei': 98, 'hanmeimei': 87, 'zhangsan': 65, 'laowang': 89 }res = sorted(data.items(), key=operator.itemgetter(1), reverse=True)print(res) # 结果 [('lilei', 98), ('laowang', 89), ('hanmeimei', 87), ('zhangsan', 65)]
可以看到基本和方案二一个意思,但是多引入了operator模块,实在没有必要,还是推举方案二。
以上三种方法都是创建一个新的经由排序的列表,原始字典的顺序并不会改变。如果须要按值对字典进行原地排序,可以利用collections模块中的OrderedDict类。
如果字典的值具有相同的值,那么排序的顺序是不愿定的,由于字典是无序的。