1. 程式人生 > 實用技巧 >如何根據字典中值的大小,對字典中的項進行排序?

如何根據字典中值的大小,對字典中的項進行排序?

需求:
某班英語成績,儲存為
{'lilei':78,
'jim':88,
'mike':99}
如何根據成績高低計算學生排名?

思路:
將字典中的各項轉化為元組,使用內建函式sorted進行排序
方法一:將字典中的項轉換成值在前,鍵在後的元組。(列表解析,或zip)
方法二:傳遞sorted函式的key引數

程式碼:

方法一:
In [22]: (3,2) > (1,4)
Out[22]: True

In [23]: (3,2) > (3,4)
Out[23]: False

In [24]: from random import randint

In [25]: { k: randint(60,100) for k in 'abcdefg'}
Out[25]: {'a': 62, 'b': 69, 'c': 64, 'd': 82, 'e': 94, 'f': 93, 'g': 70}

In [26]: d = { k: randint(60,100) for k in 'abcdefg'}

In [27]: d
Out[27]: {'a': 66, 'b': 68, 'c': 65, 'd': 70, 'e': 88, 'f': 80, 'g': 89}

In [28]: [(v,k) for k,v in d.items()]
Out[28]: [(66, 'a'), (68, 'b'), (65, 'c'), (70, 'd'), (88, 'e'), (80, 'f'), (89, 'g')]

In [29]: l = [(v,k) for k,v in d.items()]

In [30]: l
Out[30]: [(66, 'a'), (68, 'b'), (65, 'c'), (70, 'd'), (88, 'e'), (80, 'f'), (89, 'g')]

In [31]: sorted(l)
Out[31]: [(65, 'c'), (66, 'a'), (68, 'b'), (70, 'd'), (80, 'f'), (88, 'e'), (89, 'g')]

In [32]: sorted(l,reverse=True)
Out[32]: [(89, 'g'), (88, 'e'), (80, 'f'), (70, 'd'), (68, 'b'), (66, 'a'), (65, 'c')]

In [33]: zip([1,2,3],[4,5,6])
Out[33]: <zip at 0x7f1293b27448>

In [34]: list(zip([1,2,3],[4,5,6]))
Out[34]: [(1, 4), (2, 5), (3, 6)]

In [35]: list(zip(d.values(),d.keys()))
Out[35]: [(66, 'a'), (68, 'b'), (65, 'c'), (70, 'd'), (88, 'e'), (80, 'f'), (89, 'g')]

方法二:
In [36]: d.items()
Out[36]: dict_items([('a', 66), ('b', 68), ('c', 65), ('d', 70), ('e', 88), ('f', 80), ('g', 89)])

In [38]: sorted(d.items(),key = lambda item:item[1],reverse=True)
Out[38]: [('g', 89), ('e', 88), ('f', 80), ('d', 70), ('b', 68), ('a', 66), ('c', 65)]

In [39]: p = sorted(d.items(),key = lambda item:item[1],reverse=True)

In [40]: p
Out[40]: [('g', 89), ('e', 88), ('f', 80), ('d', 70), ('b', 68), ('a', 66), ('c', 65)]

In [41]: d
Out[41]: {'a': 66, 'b': 68, 'c': 65, 'd': 70, 'e': 88, 'f': 80, 'g': 89}