题目描述:给定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])
上述代码中,使用input()函数来接收多个用户输入时,需要用split()隔开 ;append()函数表示在末尾添加一个元素;使用sorted()函数用于对students列表进行排序,并返回新的列表,排序的键是一个lambda函数,该函数接受一个元组x,返回-x[1]和next((i for i,v in enumerate(students) if v==x))。其中-x[1]表示按成绩降序排序,next((i for i,v in enumerate(students) if v==x))表示在成绩相同的情况下,按姓名升序排序,其中 next 函数用于查找列表中第一个匹配当前元素的索引值。
不过,需要注意的是,这段代码中的next函数可能会引发StopIteration异常,因为在成绩相同的情况下,可能找不到下一个元素。为了避免这种情况,可以使用Python的enumerate函数,将列表中的元素与它们的索引一同遍历,然后比较索引。