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

例如,某班英语成绩以字典形式存储为:

{
    'Lilei': 79,
    'Jim': 88,
    'Lucy': 92,
    ...
}

要求:根据成绩高低,计算学生排名。

解决方案:将字典中的各项转换为元组,使用内置函数sorted()排序。

  1. 将字典中的项转化为(值,键)元组,使用列表解析或zip()

  2. 传递sorted()函数的key参数。


  • 对于元组的比较:
print((3, 1) > (2, 4))
print((3, 1) > (3, 2))
print((2, 7) < (4, 1))

True                #结果
False
True

元组的元素依次比较。前面元素更大的元组更大,前面元素更小的元组更小,只有当前面元组相等时才会进行后面元素的比较,依次类推。

  • 对于zip()函数:
zip(iter1 [,iter2 [...]])
z = zip((1, 2, 3, 4, 5), (6, 7, 8, 9, 10))
print(list(z))

[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]               #结果

zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*号操作符,可以将元组解压为列表。


  • 方案1示例:

列表解析:

from random import randint

d = {k: randint(60, 100) for k in 'abcdefgh'}               #生成8个分数在(60,100之间)的元素的成绩字典

answer = [(v,k) for k,v in d.items()]
print(sorted(answer, reverse=True))

[(96, 'g'), (95, 'f'), (88, 'c'), (86, 'e'), (86, 'b'), (80, 'a'), (66, 'd'), (60, 'h')]                #结果

zip()函数:

from random import randint

d = {k: randint(60, 100) for k in 'abcdefgh'}               #生成8个分数在(60,100之间)的元素的成绩字典

answer = list(zip(d.values(), d.keys()))
print(sorted(answer, reverse=True))

[(98, 'b'), (89, 'e'), (88, 'd'), (79, 'c'), (67, 'f'), (67, 'a'), (66, 'h'), (60, 'g')]                #结果

  • 方案2示例:
from random import randint

d = {k: randint(60, 100) for k in 'abcdefgh'}               #生成8个分数在(60,100之间)的元素的成绩字典

answer = sorted(d.items(), key=lambda item: item[1], reverse=True)
answer = {k:(i, v) for i,(k,v) in enumerate(answer, 1)}             #字典解析
print(answer)

{'b': (1, 98), 'e': (2, 96), 'h': (3, 92), 'f': (4, 91), 'd': (5, 81), 'a': (6, 75), 'c': (7, 71), 'g': (8, 64)}                #结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值