python录入班级学生姓名_如何使用Python dict获得班上排名前10位的学生

我有一个带有学生姓名和标记的字典

dict1 = {'name1': 34, 'name2':45, 'name3': 98, 'name4':34, 'name5': 66}

我希望获得前10名学生的名字以及上述词汇中的分数.

结果:

name3 98

name5 66

name2 45

name1 34

name4 34

如果多个键具有相同的值,则键必须按字母顺序排列(例如:name1和name4按字母顺序排列,相同值为34)

如何完成它?

解决方法:

天真的解决方案

你可以用普通的python写这个:

>>> names = {'name1': 34, 'name2':45, 'name3': 98, 'name4':34, 'name5': 66}

>>> sorted_names = sorted(names.iteritems(), key=lambda (k, v): (-v, k))[:10]

>>> sorted_names

[('name3', 98), ('name5', 66), ('name2', 45), ('name1', 34), ('name4', 34)]

sorted作为比较用于排序的关键

然后根据需要打印它们:

>>> for name, score in sorted_names:

... print name, score

...

name3 98

name5 66

name2 45

name1 34

name4 34

或者只是一次完成所有操作:

>>> for name, score in sorted(names.iteritems(), key=lambda (k, v): (-v, k))[:10]:

... print name, score

...

name3 98

name5 66

name2 45

name1 34

name4 34

使用heapq,特别是heapq.nsmallest,您可以拥有更优雅的解决方案:

>>> from heapq import nsmallest

>>> for name, score in nsmallest(10, names.iteritems(), key=lambda (k, v): (-v, k)):

... print name, score

...

name3 98

name5 66

name2 45

name1 34

name4 34

我喜欢这个解决方案的是nsmallest可以智能地实现.它可能类似于懒惰的实现,就像在Lazy Evaluation and Time Complexity的答案中所描述的那样.所以,你只需要做最少量的工作.虽然天真的解决方案必须在获得前10个之前对整个迭代进行排序.

标签:python,dictionary

来源: https://codeday.me/bug/20190712/1441931.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值