Python 查找嵌套列表程序的第二大编号

Python 查找嵌套列表程序的第二大编号,python,list,Python,List,在一个由N名学生组成的物理课堂上,为每个学生提供姓名和成绩,将其存储在嵌套列表中,并打印所有成绩第二低的学生的姓名 注意:如果有多个学生成绩相同,请按字母顺序排列他们的名字,并在新行上打印每个名字 输入 以下是我回答上述问题的代码:- marks = sorted([student[i][1] for i in range(len(student))], reverse = True) for num in range(1,len(marks)): if marks[num] <

在一个由N名学生组成的物理课堂上,为每个学生提供姓名和成绩,将其存储在嵌套列表中,并打印所有成绩第二低的学生的姓名

注意:如果有多个学生成绩相同,请按字母顺序排列他们的名字,并在新行上打印每个名字

输入

以下是我回答上述问题的代码:-

marks = sorted([student[i][1] for i in range(len(student))], reverse = True)

for num in range(1,len(marks)):
    if marks[num] < marks[0]:
        if marks[num+1] < marks[num]:
            temp = marks[num+1]
            break
    else:
        continue
second_top = [student[i] for i in range(len(student)) if student[i][1] == temp]

topper = sorted([k for k,l in second_top])

for i in range(len(topper)):
    print(topper[i])

是否有办法改进此代码。我是Python新手,开始在黑客级别上练习

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

ranked = sorted(students, key=lambda a: (a[1], a[0]))

second_best = ranked[1][1]  # or whichever rank you want

print(ranked)

ex_aequos = [s for s in ranked if s[1] == second_best]

print(ex_aequos)  
结果:

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

试试这个,这也解释了ex aequos的原因:

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

ranked = sorted(students, key=lambda a: (a[1], a[0]))

second_best = ranked[1][1]  # or whichever rank you want

print(ranked)

ex_aequos = [s for s in ranked if s[1] == second_best]

print(ex_aequos)  
结果:

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

您可以使用列表理解和:

输出:

Berry
Harry
Berry
Harry
另一种方法是将您的数据存储在一个表中,其中键是分数,值是一个列表,其中包含所有具有键指定的分数的学生:

from collections import defaultdict

grade_student = defaultdict(list)
for student, grade in students:
    grade_student[grade].append(student)

# second lowest grade   
second_grade = sorted(grade_student.keys())[1]

# order the names alphabetically and print each name on a new line
print(*sorted(grade_student[second_grade]), sep='\n')
输出:

Berry
Harry
Berry
Harry

您可以使用列表理解和:

输出:

Berry
Harry
Berry
Harry
另一种方法是将您的数据存储在一个表中,其中键是分数,值是一个列表,其中包含所有具有键指定的分数的学生:

from collections import defaultdict

grade_student = defaultdict(list)
for student, grade in students:
    grade_student[grade].append(student)

# second lowest grade   
second_grade = sorted(grade_student.keys())[1]

# order the names alphabetically and print each name on a new line
print(*sorted(grade_student[second_grade]), sep='\n')
输出:

Berry
Harry
Berry
Harry

首先,我将按y升序对等级进行排序:

>>> students = [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]]
>>> grades = sorted(set(g for _, g in students))
>>> grades
[37.2, 37.21, 39, 41]
学生中g,g的行集合提取成绩并删除重复集合

然后选择列表中的第二个元素,即第二个最低等级:

>>> second_lowest_grade = grades[1]
>>> second_lowest_grade
37.21
>>> for name in sorted(n for n, g in students if g == second_lowest_grade):
...     print(name)
... 
Berry
Harry
然后为成绩第二低的学生循环排列好的名字:

>>> second_lowest_grade = grades[1]
>>> second_lowest_grade
37.21
>>> for name in sorted(n for n, g in students if g == second_lowest_grade):
...     print(name)
... 
Berry
Harry

首先,我将按y升序对等级进行排序:

>>> students = [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]]
>>> grades = sorted(set(g for _, g in students))
>>> grades
[37.2, 37.21, 39, 41]
学生中g,g的行集合提取成绩并删除重复集合

然后选择列表中的第二个元素,即第二个最低等级:

>>> second_lowest_grade = grades[1]
>>> second_lowest_grade
37.21
>>> for name in sorted(n for n, g in students if g == second_lowest_grade):
...     print(name)
... 
Berry
Harry
然后为成绩第二低的学生循环排列好的名字:

>>> second_lowest_grade = grades[1]
>>> second_lowest_grade
37.21
>>> for name in sorted(n for n, g in students if g == second_lowest_grade):
...     print(name)
... 
Berry
Harry