您现在的位置是:首页 >技术交流 >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
函数用于查找列表中第一个匹配当前元素的索引值。这样,排序算法就会根据成绩从高到低进行排序,并在成绩相同时保留原来在名单中的顺序。