繁体   English   中英

如何获得成绩第二低的学生名单?

[英]How to get the list of students with second lowest grade?

我正在尝试解决编码网站的问题。 我想出了以下问题。

问题:给定学生 class 中每个学生的姓名和成绩,将它们存储在嵌套列表中并打印成绩第二低的任何学生的姓名。

注意:如果有多个学生成绩倒数第二,请按字母顺序排列他们的姓名,并将每个姓名打印在新行上。

例子

分数的有序列表是,所以第二低的分数是。 有两个学生的分数: 。 按字母顺序排列,名称打印为:

alpha beta 输入格式

第一行包含一个 integer, ,学生人数。 随后的几行逐行描述了每个学生。

  • 第一行包含一个学生的姓名。
  • 第二行包含他们的成绩。

约束

总会有一名或多名学生成绩第二低。 Output 格式

打印成绩第二低的任何学生的姓名。如果有多个学生,请按字母顺序排列他们的姓名,并将每个学生都打印在新行上。

样本输入 0

5
Harry
37.21
Berry
37.21
Tina
37.2
Akriti
41
Harsh
39

样品 Output 0

Berry
Harry

解释 0

在这个 class 中有学生,他们的姓名和成绩被组合起来构建以下列表:

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

最低等级的属于蒂娜。 第二低的等级属于 Harry 和 Berry,所以我们按字母顺序排列他们的名字并将每个名字打印在一个新行上。

参考链接: codingurl

我尝试了以下两种解决方案,但在锁定的测试用例中都失败了。

解决方案1:

if __name__ == '__main__':
    st = []
    for _ in range(int(input())):
        name = input()
        score = float(input())
        st.append([name,score])
    
    lowest=st[0][1]
    second_lowest=st[0][1]
    for student in st:
        if student[1]<lowest:
            second_lowest=lowest
            lowest=student[1]
    
    ls=[]
    for i in range(len(st)):
        if st[i][1]==second_lowest:
            ls.append(st[i][0])
            
    for i in sorted(ls):
        print(i)

解决方案2:

if __name__ == '__main__':
    st = []
    for _ in range(int(input())):
        name = input()
        score = float(input())
        st.append([name,score])
    
    lowest=st[0][1]
    second_lowest=st[0][1]
    for student in st:
        if student[1]<lowest:
            second_lowest=lowest
            lowest=student[1]
    
    ls=[]
    for i in range(len(st)):
        if st[i][1]==lowest:
            ls.append(i)
            
    for i in ls:
        del st[i]
    
    lowest=st[0][1]
    for student in st:
        if student[1]<lowest:
            second_lowest=lowest
            lowest=student[1]
    
    ls=[]
    for i in range(len(st)):
        if st[i][1]==lowest:
            ls.append(st[i][0])
            
    for i in sorted(ls):
        print(i)

你能建议我哪里出错了。

似乎您通过将min()重新实现为循环尝试让它在单次通过中跟踪最小值和第二最小值(这似乎应该容易被愚弄)来过度复杂化它按局部最小值——如果您要使用不同顺序的输入单步执行您的代码,我怀疑您可以准确找出哪里出错了)。 请记住,最低和/或第二低可能存在平局。

只需使用min()并分两次执行:

# Get all the input as a list of (name, score).
grades = [
    (input(), float(input()))
    for _ in range(int(input()))
]

# Drop the lowest score.
lowest = min(score for _, score in grades)
grades = [(name, score) for name, score in grades if score > lowest]

# Drop all EXCEPT the lowest of what remains.
lowest = min(score for _, score in grades)
grades = [(name, score) for name, score in grades if score == lowest]

# Sort and print.
grades.sort()
for name, _ in grades:
    print(name)

我通常使用 defaultdict 来解决这样的情况:

>>> from collections import defaultdict
>>> 
>>> d = defaultdict(list)
>>> students_scores = [
...     ['Harry', 37.21],
...     ['Berry', 37.21],
...     ['Tina', 37.2],
...     ['Akriti', 41],
...     ['Harsh', 39]
... ]
>>> 
>>> for student, score in students_scores:
...   d[score] += [student]
... 
>>> second_lowest_score = sorted(d.keys())[1]
>>> second_lowest_students = sorted(d[second_lowest_score])
>>> print(second_lowest_students)
['Berry', 'Harry']
>>> 
students = [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], 
['Harsh', 39]]
students.sort()
for i in students:
    if i[1] > 37.2 and i[1] < 39:
        print(i[0])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM