目录
题目描述
给出n个学生的姓名和成绩,将学生成绩从高到低排序,成绩相同的学生,按照姓名拼音从小到大排序
输入
输入包括多行,第一行是一个整数n(0<n<10),接下来有n行,每一行有学生姓名和两门课的成绩
输出
输出排序后的结果:排序原则:将学生成绩从高到低排序,成绩相同的学生,按照姓名拼音从小到大排序。
样例输入
3
tom 80 90
jack 80 78
lucy 81 77
样例输出
tom 80 90
jack 80 78
lucy 81 77
题目分析:注意两点
1.降序排序
2.成绩相同时,字典序小的名字在前
思路分析:
1.用字典:姓名作为键,成绩作为键值
2.用sorted进行排序
代码详解:
n=int(input())
dt={}
for i in range(n):
s=input().split()
dt[s[0]]=(int(s[1]),int(s[2]))#将姓名作为键,将两科成绩放在一个元组里边作为键值
l=sorted(dt.items(),key=lambda x:(-(x[1][0]+x[1][1]),x[0]))#排序过程有详解
for x in l:
print(x[0],x[1][0],x[1][1])#最后输出
排序过程详解:首先通过上边的循环构造了一个姓名作为键,两科成绩放在一个元组里面作为键值的字典,用dt.items()取所有的键和值放在一个列表里边,未经排序的dt.items()为[(tom,(80,90)),(jack,(80,78)),(lucy,(81,77))],通过sorted的另一个参数key来控制排序方法。
先考虑成绩不同时的过程:因为sorted默认是从小到大排,所以取两门成绩之和的相反数-(x[1][0]+x[1][1]),(x[1][0]+x[1][1])越大则其相反数就越小,所以成绩中最高的就在前边,
接下来考虑成绩相同的情况:因为最后返回的是一个元组(-(x[1][0]+x[1][1]),x[0]),元组比较大小是逐个比较的当第一个参数元素相同时即比较第二个,因为sorted默认是从小到大排所以,当分数相同时,姓名字母序小的在前。
加油!!!
文章出处登录后可见!
已经登录?立即刷新