给出学生的物理班级中每个学生的姓名和等级,将它们存储在嵌套列表中,并打印所有成绩第二低的学生的姓名。
注意:如果有多个同等级的学生,请按字母顺序排列其姓名,并在新行上打印每个姓名。
输入格式
第一行包含一个整数,即学生人数。 接下来的几行用行来描述每个学生;第一行包含学生的姓名,第二行包含学生的成绩。
约束
总是会有一个或多个学生的成绩第二低。 输出格式
打印任何物理成绩最低的学生的姓名;如果有多个学生,请按字母顺序排列其姓名,然后将每个姓名打印在新行上。
这是我的代码:
list = []
for _ in range(int(input())):
name = input()
score = float(input())
new = [name, score]
list.append(new)
def snd_highest(val):
return val[1]
list.sort(key = snd_highest)
list.sort()
value = list[1]
grade = value[1]
for a,b in list:
if b == grade:
print (a)
这是测试用例: 4 雷切尔 -50 毛wer -50 光泽 -50 沙欣 51
预期的输出是Shaheen,但我得到了其他3。 请解释。
答案 0 :(得分:0)
要找到第二个最低值,您实际上只是按照升序对列表进行排序,并使用下面的代码获取了列表中的第二个值
value = list[1]
grade = value[1]
想象一下这是您排序后的列表:
[['Sheen', 50.0], ['mawer', 50.0], ['rachel', 50.0], ['shaheen', 51.0]]
根据value = list[1]
,程序选择“ value = ['mawer',50.0]”。
然后,程序的其余部分从该值中获得分数并输出相应的名称,这就是为什么该名称不能按您的要求运行的原因,您需要编写逻辑以找到最低的值,然后找到第二低的值,此当前程序仅假设最小值位于列表中的第二个位置。
答案 1 :(得分:0)
if __name__ == '__main__':
students = []
for _ in range(int(input())):
name = input()
score = float(input())
new = [name, score]
students.append(new)
def removeMinimum(oldlist):
oldlist = sorted(oldlist, key=lambda x: x[1])
min_ = min(students, key=lambda x: x[1])
newlist = []
for a in range(0, len(oldlist)):
if min_[1] != oldlist[a][1]:
newlist.append(oldlist[a])
return newlist
students = removeMinimum(students);
# find the second minimum value
min_ = min(students, key=lambda x: x[1])
# sort alphabetic order
students = sorted(students, key=lambda x: x[0])
for a in range(0, len(students)):
if min_[1] == students[a][1]:
print(students[a][0])
答案 2 :(得分:-1)
我希望这可以帮助您通过所有测试用例。谢谢。
# These functions will be used for sorting
def getSecond(ele):
return ele[1]
def getFirst(ele):
return ele[0]
studendList = []
sortedList = []
secondLowestStudents = []
# Reading input from STDIN and saving in nested list [["stud1": <score>], ["stud2", <score>]]
for _ in range(int(input())):
name = input()
score = float(input())
studendList.append([name, score])
# sort the list by score and save it in a new list studendList (remove the duplicate score as well - see, if x[1] not in sortedList)
studendList.sort(key=getSecond)
[sortedList.append(x[1]) for x in studendList if x[1] not in sortedList]
# Get the second lowest grade
secondLowest = sortedList[1]
# Now sort the origin list by the name fetch the student list having the secondLowest grade
studendList.sort(key=getFirst)
[secondLowestStudents.append(x[0]) for x in studendList if x[1] == secondLowest]
# Print the student's name having second-lowest grade
for st in secondLowestStudents:
print(st)