成绩排序(思路+代码详解)Python实现

目录

题目描述

输入

输出

样例输入

样例输出

题目分析:注意两点

思路分析:

代码详解:


题目描述

给出n个学生的姓名和成绩,将学生成绩从高到低排序,成绩相同的学生,按照姓名拼音从小到大排序

输入

输入包括多行,第一行是一个整数n(0

输出

输出排序后的结果:排序原则:将学生成绩从高到低排序,成绩相同的学生,按照姓名拼音从小到大排序。

样例输入

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默认是从小到大排所以,当分数相同时,姓名字母序小的在前。




 加油!!!

你可能感兴趣的:(学校OJ,python学习笔记,排序算法,python)