思路:
将字典中的各项转换为元组,再通过内置的sorted函数进行排序
from random import shuffle
from random import randint
names = list('abcdefghig')
print(names)
# ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g']
# 进行洗牌,将这个列表的顺序打乱
shuffle(names)
print(names)
#['c', 'e', 'i', 'd', 'a', 'f', 'g', 'h', 'g', 'b']
# 初始化这个随机的字典
students = {k:randint(30,100) for k in names}
print(students)
#输出结果:
#{'c': 40, 'e': 39, 'i': 77, 'd': 90, 'a': 89, 'f': 64, 'g': 63, 'h': 49, 'b': 94}
因为元组可以进行比较,根据位置依次去比较,如:
print( (3,4)>(2,5) ) #True
print( (2,4)>(2,1) ) #True
print( (2,4)>(2,6) ) #False
print( (2,4)>(4,1) ) #False
print( (2,1)>(4,2) ) #False
# 先比较第一个数,如果相同,就比较下一个数,否则直接返回结果
所以我们将(k,v) 转换为(v,k) 后再进行比较
l = [(v,k) for k,v in students.items()]
print(l)
print(sorted(l, reverse=True))
# 也可以直接使用 zip将两个list合并成元组
zip_list = list(zip(students.values(), students.keys()))
print(zip_list)
print(sorted(zip_list, reverse=True))
# 结果如下:
[(40, 'c'), (39, 'e'), (77, 'i'), (90, 'd'), (89, 'a'), (64, 'f'), (63, 'g'), (49, 'h'), (94, 'b')]
[(94, 'b'), (90, 'd'), (89, 'a'), (77, 'i'), (64, 'f'), (63, 'g'), (49, 'h'), (40, 'c'), (39, 'e')]
[(40, 'c'), (39, 'e'), (77, 'i'), (90, 'd'), (89, 'a'), (64, 'f'), (63, 'g'), (49, 'h'), (94, 'b')]
[(94, 'b'), (90, 'd'), (89, 'a'), (77, 'i'), (64, 'f'), (63, 'g'), (49, 'h'), (40, 'c'), (39, 'e')]
s = sorted(students.items(), key=lambda item:item[1], reverse=True)
print(s)
结果:
[('b', 94), ('d', 90), ('a', 89), ('i', 77), ('f', 64), ('g', 63), ('h', 49), ('c', 40), ('e', 39)]
我们再将结果修改成 {学生名字 : (名次,成绩)} 的形式
# 我们可以直接使用python 中的enumerate关键字,可以将 可迭代对象 s,按照顺序输出,并指定起始值为1,因为默认是0 ,这样我们名次就可以直接使用这个 i 的值了
print(list(enumerate(s, 1)))
# 结果
[(1, ('b', 94)), (2, ('d', 90)), (3, ('a', 89)), (4, ('i', 77)), (5, ('f', 64)), (6, ('g', 63)), (7, ('h', 49)), (8, ('c', 40)), (9, ('e', 39))]
# 注意这个 (k,v) ,因为返回(1, ('b', 94)) , 所以我们通过
# i,(k,v) = (1, ('b', 94)) 这种形式,直接进行拆包,将值直接赋值给i,k,v
sort_s = { k:(i,v) for i,(k,v) in enumerate(s, 1)}
print(sort_s)
# 结果
{'b': (1, 94), 'd': (2, 90), 'a': (3, 89), 'i': (4, 77), 'f': (5, 64), 'g': (6, 63), 'h': (7, 49), 'c': (8, 40), 'e': (9, 39)}