根据字典中的值的大小,对字典排序

思路:
将字典中的各项转换为元组,再通过内置的sorted函数进行排序

使用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')]

又因为sorted函数中有key的关键字,来指明用哪个值做比较,所以可以更简单一点
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)}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值