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