25 Jan 2017
# 生成一个字典 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']
我们可以利用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
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排序
# 正序排列 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参数代表逆序排列