如何根据字典中值的大小,对字典中的项进行排序?

需求:
某班英语成绩,存储为
{'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}

# 将名次信息更新到 字典中In [2]: from random import randint

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

In [4]: d
Out[4]: {'a': 86, 'b': 66, 'c': 80, 'd': 82, 'e': 87, 'f': 89, 'g': 95}

In [5]: sorted(d.items(),key = lambda item:item[1],reverse=True)
Out[5]: [('g', 95), ('f', 89), ('e', 87), ('a', 86), ('d', 82), ('c', 80), ('b', 66)]

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

In [7]: p
Out[7]: [('g', 95), ('f', 89), ('e', 87), ('a', 86), ('d', 82), ('c', 80), ('b', 66)]

In [8]: enumerate(p)
Out[8]: <enumerate at 0x7fe3d27d73f0>

In [9]: list(enumerate(p))
Out[9]: 
[(0, ('g', 95)),
 (1, ('f', 89)),
 (2, ('e', 87)),
 (3, ('a', 86)),
 (4, ('d', 82)),
 (5, ('c', 80)),
 (6, ('b', 66))]

In [10]: list(enumerate(p,1))
Out[10]: 
[(1, ('g', 95)),
 (2, ('f', 89)),
 (3, ('e', 87)),
 (4, ('a', 86)),
 (5, ('d', 82)),
 (6, ('c', 80)),
 (7, ('b', 66))]

In [11]: for i,(k,v) in enumerate(p,1):
    ...:     print(i,k,v)
    ...: 
1 g 95
2 f 89
3 e 87
4 a 86
5 d 82
6 c 80
7 b 66

In [12]: for i,(k,v) in enumerate(p,1):
    ...:     d[k] = (i,v)
    ...: 
    ...: 

In [13]: d
Out[13]: 
{'a': (4, 86),
 'b': (7, 66),
 'c': (6, 80),
 'd': (5, 82),
 'e': (3, 87),
 'f': (2, 89),
 'g': (1, 95)}

In [14]: {k:(i,v) for i,(k,v) in enumerate(p,1)}
Out[14]: 
{'g': (1, 95),
 'f': (2, 89),
 'e': (3, 87),
 'a': (4, 86),
 'd': (5, 82),
 'c': (6, 80),
 'b': (7, 66)}

posted @ 2020-10-29 17:35  Richardo-M-Lu  阅读(157)  评论(0编辑  收藏  举报