python's docs

1.4.0 根据字典的值进行排序


1. sorted默认情况下只对dict的key进行排序

# 生成一个字典
In [1]: from random import randint
In [2]: score = {x: randint(60, 100) for x in 'xyzabc'}
In [5]: score
Out[5]: {'a': 98, 'b': 95, 'c': 100, 'x': 100, 'y': 78, 'z': 76}

# 默认用key来排序
In [7]: sorted(score)
Out[7]: ['a', 'b', 'c', 'x', 'y', 'z']

2. tuple的排序特性

我们可以利用tuple的特性来比较大小,tuple是按照元素顺序来比较大小的,先比对第一个元素,如果相等比对下一个元素

# 2比1大,所以直接返回True
In [8]: (2, 'a') > (1, 'b')
Out[8]: True

# 2与2相等,比对"a"与"b",字母无法比较大小,所以返回false
In [9]: (2, 'a') > (2, 'b')
Out[9]: False

3. 使用zip转换dict为tuple进行排序

In [20]: sorted(zip(score.itervalues(), score.iterkeys()))
Out[20]: [(76, 'z'), (78, 'y'), (95, 'b'), (98, 'a'), (100, 'c'), (100, 'x')]

其实这里相当于使用zip将dict的key和value进行了调换,然后使用sorted排序


4. 使用dict.items将dict转换成tuple进行排序

# 正序排列
In [14]: sorted(score.items(), key=lambda x: x[1])
Out[14]: [('z', 76), ('y', 78), ('b', 95), ('a', 98), ('c', 100), ('x', 100)]

# 逆序排列
In [17]: sorted(score.items(), key=lambda x: x[1], reverse=True)
Out[17]: [('c', 100), ('x', 100), ('a', 98), ('b', 95), ('y', 78), ('z', 76)]

sorted的key参数很强大,可以引入一个函数来对目标进行排序,这里我们使用了一个lambda函数,而且我们使用dict的items方法,将dict转换成了一个tuple,跟上面不同的是,key和value的值并没有调换。而这里使用的是lambda函数指定使用value的方式来进行排序
reverse参数代表逆序排列