PAT(乙级)成绩排名

题目

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式

第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
… … …
第 n+1 行:第 n 个学生的姓名 学号 成绩

其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式

对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出样例

Mike CS991301
Joe Math990112

方法一

n=int(input())
namelist=[]
idlist=[]
scorelist=[]
for i in range(n):
    xinxistr=input()
    a=xinxistr.split()    
    namelist.append(a[0])
    idlist.append(a[1])
    scorelist.append(int(a[2]))
maxnum=scorelist.index(max(scorelist))
minnum=scorelist.index(min(scorelist))
print(namelist[maxnum]+" "+idlist[maxnum])
print(namelist[minnum]+" "+idlist[minnum])

思路:用三个列表分别储存姓名,学号,成绩;然后查找出成绩最大值和成绩最小值的索引。

知识点:提取空格分开的字符串

>>> xinxistr=input()
Joe Math990112 89
>>> a=xinxistr.split()
>>> print(a)
['Joe', 'Math990112', '89']
>>> 

方法二

n=int(input())
student=[]
scorelist=[]
for i in range(n):
    xinxistr=input()
    a=xinxistr.split()
    studict={}
    studict['name']=a[0]
    studict['id']=a[1]
    studict['score']=int(a[2])
    student.append(studict)
for i in student:
    scorelist.append(i['score'])
    
maxid=scorelist.index(max(scorelist))
minid=scorelist.index(min(scorelist))
print(student[maxid]['name']+" "+student[maxid]['id'])
print(student[minid]['name']+" "+student[minid]['id'])

思路:用一个字典来表示学生的“姓名”,“学号”,“分数”等信息,然后用一个列表来包含不同的字典。

知识点:1.字典里添加键值对

>>> adict={}
>>> adict["成绩"]=89
>>> adict["学号"]=20206389
>>> print(adict)
{'成绩': 89, '学号': 20206389}
>>> 

知识点2:在一个列表里循环添加字典:

错误案例:

n=int(input())
student=[]
studict={}
scorelist=[]
for i in range(n):
    xinxistr=input()
    a=xinxistr.split()
    studict['name']=a[0]
    studict['id']=a[1]
    studict['score']=int(a[2])
    student.append(studict)
    
print(student)  

以上代码输入样本案例后得到如下结果:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
[{'name': 'Mary', 'id': 'EE990830', 'score': 95}, {'name': 'Mary', 'id': 'EE990830', 'score': 95}, {'name': 'Mary', 'id': 'EE990830', 'score': 95}]
>>> 

也就是说列表里的三个字典是一样的,后来值把前面的值都覆盖掉了。

正确代码:

n=int(input())
student=[]
scorelist=[]
for i in range(n):
    xinxistr=input()
    a=xinxistr.split()
    studict={}
    studict['name']=a[0]
    studict['id']=a[1]
    studict['score']=int(a[2])
    student.append(studict)
    

输出结果:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
[{'name': 'Joe', 'id': 'Math990112', 'score': 89}, {'name': 'Mike', 'id': 'CS991301', 'score': 100}, {'name': 'Mary', 'id': 'EE990830', 'score': 95}]
>>> 

知识点三:遍历时i的含义

这里的 i 指的是一个索引数字。

for i in range(len(student)):
    print(student[i]['name'])

这里的 i 指的是一个字典(student是一个成员为字典的列表)

for i in student:
       print(i['score'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力全开666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值