华为OD机试题-学生姓名和成绩不重复排序(Python版)-分值100

题目描述:给定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函数,将列表中的元素与它们的索引一同遍历,然后比较索引。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值