蓝桥杯-奖学金-Python(多关键字排序)

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学生发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前 5 名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:

 7 279
 5 279

这两行数据的含义是:总分最高的两个同学的学号依次是 7 号、5 号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和),但学号为 7 的学生语文成绩更高一些。如果你的前两名的输出数据是:

 5 279
 7 279

则按输出错误处理,不能得分。

输入描述

第 1 行为一个正整数 n (6 <= n <= 300),表示该校参加评选的学生人数。

第 2 到 n+1行,每行有 3个用空格隔开的数字,每个数字都在 0 到 100 之间。第 j行的 3 个数字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1~ n(恰好是输入数据的行号减 1)。

所给的数据都是正确的,不必检验。

输出描述

输出共有 5行,每行是两个用空格隔开的正整数, 依次表示前 5 名学生的学号和总分。

输入输出样例

示例 1

输入

 6
 90 67 80
 87 66 91
 78 89 91
 88 99 77
 67 89 64
 78 89 98

输出

 6 265
 4 264
 3 258
 2 244
 1 237

示例 2

输入

 8
 80 89 89
 88 98 78
 90 67 80
 87 66 91
 78 89 91
 88 99 77
 67 89 64
 78 89 98

输出

 8 265
 2 264
 6 264
 1 258
 5 258

解题思路:
利用嵌套列表字典将值存储好之后,使用python自带的itemgetter模块实现多关键字排序
注意事项:

  • 题目中其他两个成绩是从大到小,而id是小的优先,顺序不一样,为了统一处理,我在赋值id的时候就让它的值反正赋值
  • 比如如果是6个学生的话,id为1的我弄成5,4->2,3->3,2->4,1->5,这样就统一了大家的次序,观察可得他们之间的和是相等的,
  • 所以只需要在最后输出的时候改为student+1-特殊改变的id,就可以还原回去,然后打印输出就行了

参考代码:

#奖学金
from operator import itemgetter
student=int(input())
student_list=[]
for n in range(student):
    dist={}
    list_score=list(map(int,input().split()))
    dist['all']=sum(list_score)
    dist['cn']=list_score[0]
    dist['id']=student-n
    student_list.append(dist)
d=sorted(student_list,key=itemgetter('all','cn','id'),reverse=True)
for i in range(min(5,student)):
    print("{} {}".format((student+1)-d[i]['id'],d[i]['all']))
    

变量解释:

  1. student:输入学生的个数
  2. student_list:一个嵌套字典的列表,输入实例一后:[{'all': 237, 'cn': 90, 'id': 6}, {'all': 244, 'cn': 87, 'id': 5}, {'all': 258, 'cn': 78, 'id': 4}, {'all': 264, 'cn': 88, 'id': 3}, {'all': 220, 'cn': 67, 'id': 2}, {'all': 265, 'cn': 78, 'id': 1}]
  3. dist:不断去填充值
  4. d用来获取sorted的返回列表,sorted不会改变原来的列表的,而是返回一个排完序之后的新列表这个需要注意.

总结:
        掌握一个使用itemgetter对于嵌套字典列表的多关键字排序吧,还是有一些收获的.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Copdi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值