一些测试用例失败。告诉我出了什么问题

时间:2019-10-13 08:22:14

标签: python list nested-lists

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

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

输入格式

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

约束

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

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

样本输入0

5 哈利 37.21 浆果 37.21 蒂娜 37.2 阿克里蒂 41 苛刻 39 样本输出0

浆果 哈利 说明0

该班级的一些学生的名字和年级经过汇编以建立以下列表:

python students = [[''Harry',37.21],['Berry',37.21],['Tina',37.2],['Akriti',41],['Harsh',39]]

最低等级属于Tina。哈利和贝里的年级第二低,因此我们按字母顺序排列它们的名称,并在新行上打印每个名称。

我的代码: **

marksheet=[]
for _ in range(int(raw_input())):
    stud=[]
    name = raw_input()
    score = float(raw_input())
    stud.append(name)
    stud.append(score)
    marksheet.append(stud)
marksheet.sort(key= lambda x:x[0])
minimum = min(marksheet,key = lambda x:x[1])
for x in marksheet:
    if x[1]== minimum[1]:
        marksheet.remove(x)
sec_high=min(marksheet, key= lambda x :x[1]  )
for x in marksheet:
    if x[1] == sec_high[1]:
        print x[0]

**

2 个答案:

答案 0 :(得分:0)

工作解决方案(在Hackerank上测试)

# Gather Inputs
n = int(raw_input())
lst = []
for x in range(n):
    lst.append([raw_input(), float(raw_input())])

# Sort by score (i.e. sublists are [name, score])
lst = sorted(lst, key=lambda x: x[1])

# Find second lowest score
for x in range(1, n):
    if(lst[x][1] != lst[x-1][1]):
        score = lst[x][1]
        break

#Sort by name
lst = sorted(lst)

# Aggregate students whose result was score
# this is the second lowest value
lower_scorers = [x[0] for x in lst if x[1] == score]

print "\n".join(lower_scorers)

测试

输入

5
Harry
37.21
Berry
37.21
Tina
37.2
Akriti
41
Harsh
39

输出

Berry
Harry

答案 1 :(得分:0)

看看Python 3.7中的这个解决方案...

if __name__ == '__main__':
    mark_sheet = []
    _min = 1e99
    for _ in range(int(input())):
        name = input()
        score = float(input())
        if score < _min:
            _min = score
        mark_sheet.append((name, score))

    # make a new mark_sheet excluding the one(s) that have the minimum score and 
    # sort on score in ascending order
    mark_sheet = sorted([mark for mark in mark_sheet if mark[1] != _min], key=lambda x: x[1])

    # if there is still a list then the first item should have the second best score
    mark_second_best = []
    if mark_sheet:
        second_best_score = mark_sheet[0][1]

        # make a list with the second best score and sort on name
        mark_second_best = sorted([mark for mark in mark_sheet if mark[1] == second_best_score],
            key=lambda x: x[0])

    # and print the result
    for mark in mark_second_best:
        print(mark[0])

通过了HackerRank。