您现在的位置是:首页 >技术交流 >1427 :成绩排序 【C/C++/Java/Python】(算法,排序,基础程序设计,字典)网站首页技术交流
1427 :成绩排序 【C/C++/Java/Python】(算法,排序,基础程序设计,字典)
题目描述
给定n(1≤n≤100)个学生的姓名和成绩,按照成绩从高到低排序输出。学生的姓名不会重复,如果有成绩相同的,则原来在名单中靠前的同学仍然排列在前面。
 例如有一个班的成绩如下:
 Deirdr 89
 Sheil 50
 Cynthi 63
 Rene 66
 Emm 46
 Myrn 42
 Nicol 63
 Prudenc 66
 Adel 79
 排序之后为:
 Deirdr 89
 Adel 79
 Rene 66
 Prudenc 66
 Cynthi 63
 Nicol 63
 Sheil 50
 Emm 46
 Myrn 42
 注意:Rene排在Prudenc之前,Cynthi排在Nicol之前。
提示
输入输出格式
输入格式
第一行是一个整型数n,表示后面有n个学生的数据。从第二行到第n+1行,每行表示一个学生的数据,第一列是学生的姓名,第二列是学生的成绩(都是100以内的正整数),中间以空格分隔
输出格式
排序得到的结果,每行一个学生的数据,第一列是姓名,第二列是他的成绩,中间以空格分隔。
输入输出样例
输入
7
 Aaro 100
 Colto 65
 Chas 83
 Ada 60
 Josia 94
 Zavie 100
 Dieg 81
输出
Aaro 100
 Zavie 100
 Josia 94
 Chas 83
 Dieg 81
 Colto 65
 Ada 60
n = int(input())
# 读取学生姓名和成绩,存储到列表中
students = []
for i in range(n):
    name, score = input().split()
    students.append((name, int(score)))
# 根据成绩从高到低排序,成绩相同时保留原来在名单中的顺序
students = sorted(students, key=lambda x: (-x[1], next((i for i, v in enumerate(students) if v == x))))
# 输出排序结果
for student in students:
    print(student[0], student[1])
sorted() 函数用于对可迭代对象进行排序,返回排序后的新列表。key 参数接收一个函数,用于生成排序依据,其中 lambda 表达式 x: (-x[1], next((i for i, v in enumerate(students) if v == x))) 表示将每个学生 x 的成绩 x[1] 作为排序的第一关键字,负号 - 表示降序排列;当两个学生的成绩相同时,使用 next((i for i, v in enumerate(students) if v == x)) 函数找到学生 x 在名单中的位置,即第一个与学生 x 相同的元素的下标,作为排序的第二关键字,这样就保证了在成绩相同的情况下,排序按照名单中的顺序排列。
具体来说,next函数返回生成器的下一个值。在这种情况下,使用生成器表达式 (i for i, v in enumerate(students) if v == x) 来生成一个生成器,该生成器会迭代列表 students 并返回与当前元素相等的元素的索引值 i。这个生成器在每次调用 next 函数时,都会返回下一个满足条件的索引值。
在排序中,当遇到成绩相同的情况时,需要保留原始的名单顺序。为了实现这一点,next 函数用于查找列表中第一个匹配当前元素的索引值。这样,排序算法就会根据成绩从高到低进行排序,并在成绩相同时保留原来在名单中的顺序。
 
            




 U8W/U8W-Mini使用与常见问题解决
U8W/U8W-Mini使用与常见问题解决 QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。... stm32使用HAL库配置串口中断收发数据(保姆级教程)
stm32使用HAL库配置串口中断收发数据(保姆级教程) 分享几个国内免费的ChatGPT镜像网址(亲测有效)
分享几个国内免费的ChatGPT镜像网址(亲测有效) Allegro16.6差分等长设置及走线总结
Allegro16.6差分等长设置及走线总结