正在解决一个黑客问题,一些测试用例没有通过

时间:2018-10-03 14:21:30

标签: python-3.x

给出学生的物理班级中每个学生的姓名和等级,将它们存储在嵌套列表中,并打印所有成绩第二低的学生的姓名。

注意:如果有多个同等级的学生,请按字母顺序排列其姓名,并在新行上打印每个姓名。

输入格式

第一行包含一个整数,即学生人数。 接下来的几行用行来描述每个学生;第一行包含学生的姓名,第二行包含学生的成绩。

约束

总是会有一个或多个学生的成绩第二低。 输出格式

打印任何物理成绩最低的学生的姓名;如果有多个学生,请按字母顺序排列其姓名,然后将每个姓名打印在新行上。

这是我的代码:

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。 请解释。

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)