您现在的位置是:首页 >技术交流 >1427 :成绩排序 【C/C++/Java/Python】(算法,排序,基础程序设计,字典)网站首页技术交流

1427 :成绩排序 【C/C++/Java/Python】(算法,排序,基础程序设计,字典)

半零落 2024-06-17 10:19:56
简介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 函数用于查找列表中第一个匹配当前元素的索引值。这样,排序算法就会根据成绩从高到低进行排序,并在成绩相同时保留原来在名单中的顺序。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。