Печатает имя второго по результативности самого низкого балла во вложенном списке и упорядочивает в алфавитном порядке в Python - PullRequest
0 голосов
/ 24 марта 2020
    if __name__ == '__main__':
    arr = []
        for _ in range(int(input())):
            name = input()
            arr.append(name)
            score = float(input())
            arr.append(score)

        array = [arr[i:i+2] for i in range(0, len(arr), 2)]
        marks = []
        for j in range(0, len(array)):
            marks.append(array[j][1])
        marks = list(map(float, marks))
        marks.sort()
        seclow = marks[1]
        for k in range(0, len(array)):
            if (seclow == float(array[k][1])):
                print(array[k][0])
**SAMPLE INPUT:**

    5
    Harry
    37.21
    Berry
    37.21
    Tina
    37.2
    Akriti
    41
    Harsh
    39
**EXPECTED OUTPUT:**

    BERRY
    HARRY

**MY OUTPUT:**

    HARRY
    BERRY

Единственная проблема - упорядочить имена с наименьшим количеством баллов в алфавитном порядке. Я должен использовать списки, чтобы пройти тест. Итак, какие изменения следует внести в код?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Проверьте здесь: https://ide.geeksforgeeks.org/fMD7OgxYC7

Вместо определения списка. Сохраните это в словаре. Это даст вам оптимизированное пространство. Затем отсортируйте словарь по значению. добавить имена, имеющие оценку в словаре.

Попробуйте:

import collections
if __name__ == '__main__':
    arr = {}
    for _ in range(int(input())):
        name = input()
        score = float(input())
        arr[name] = score

    dd = collections.defaultdict(list)

    for k,v in arr.items():
        dd[v].append(k)

    x = sorted(dd.items())
    sec_low = sorted(x[1][1])
    for i in sec_low:
        print(i)

Ввод:

5
Harry
37.21
Berry
37.21
Tina
37.2
Akriti
41
Harsh
39

Выход:

Berry
Harry

x:

[(37.2, ['Tina']),
 (37.21, ['Harry', 'Berry']),
 (39.0, ['Harsh']),
 (41.0, ['Akriti'])]
0 голосов
/ 24 марта 2020

Без использования импорта и с меньшим количеством кода, это можно сделать таким образом. Я также включил его в функцию, чтобы сделать его немного чище, чтобы вы могли использовать его в других местах, если это необходимо.

def main():
    scores_dict = {}
    for _ in range(int(input())):
        name, score = input(), float(input())

        if score not in scores_dict:
            scores_dict[score] = []
        scores_dict[score].append(name)

    # Delete the min score key and names so that we can grab the second min
    del scores_dict[min(scores_dict.keys())]

    # Get new min score.
    min_score = min(scores_dict.keys())

    # Sort new min score.
    scores_dict[min_score].sort()
    # Print each name in results
    [print(i) for i in scores_dict[min_score]]

if __name__ == '__main__':
    main()

...