Найти второй по величине номер вложенного списка программы - PullRequest
1 голос
/ 14 марта 2020

Учитывая имена и оценки для каждого учащегося в классе физики N учеников, сохраните их во вложенном списке и напечатайте имена всех учеников, имеющих второй младший класс.

Примечание : если несколько учеников имеют одинаковую оценку, упорядочите их имена в алфавитном порядке и напечатайте каждое имя в новой строке.

Ввод

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

Ниже приведен мой код для вышеуказанного вопроса: -

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])

Ouptut

Berry
Harry

Есть ли способ улучшить этот код Я новичок в Python начал практиковаться в ранге Хакера

Ответы [ 3 ]

3 голосов
/ 14 марта 2020

Попробуйте это, что также относится к экс-эквам:

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]]
1 голос
/ 14 марта 2020

Прежде всего, я бы отсортировал оценки по возрастанию:

>>> 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]

Строка set(g for _, g in students) извлекает оценки и удаляет дубликаты (set).

Затем возьмите второй элемент списка, который является вторым самым низким классом:

>>> second_lowest_grade = grades[1]
>>> second_lowest_grade
37.21

И затем l oop для упорядоченных имен (в алфавитном порядке) для учащихся, имеющих второй младший класс:

>>> for name in sorted(n for n, g in students if g == second_lowest_grade):
...     print(name)
... 
Berry
Harry
1 голос
/ 14 марта 2020

вы можете использовать понимание списка с itertools.groupby и itertools.islice :

from itertools import groupby, islice

s = [i[0]  for e in islice((list(g) for k, g in groupby(sorted(students), key=lambda x: x[1])), 1, 2) for i in e]

print(*s, sep='\n')

вывод:

Berry
Harry

другим подходом будет сохранение ваших данных в dict , где ключом будет оценка, а значениями будут список со всеми учащимися, у которых оценка указана ключом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...