Вывод кода в другом порядке, чем ожидалось - PullRequest
0 голосов
/ 23 марта 2020
n = int(input())  
a_name = []  
a_score = []  
for _ in range(n):  
  name = input()  
  score = float(input())  
  a_name.append(name)  
  a_score.append(score)  
a_score1 = set(a_score)  
a_score1.remove(min(a_score1))  
x = min(a_score1)  
for i in range(n):  
    if a_score[i]==x:  
        print(a_name[i]) 

Для ввода следующего кода:
5
Гарри
37.21
Ягода
37.21
Тина
37.2
Акрити
41
Хар sh
39

Мой вывод:
Гарри
Ягода

Ожидаемый результат:
Ягода
Гарри

Я новичок ie в мире программирования и был бы признателен за помощь в решении этой проблемы. Это проблема ранга хакера, и проблема в том, чтобы найти имена со вторым минимальным счетом. Мне удалось пройти 8/10 тестовых случаев, но с этим решением не удалось выполнить 2 тестовых случая. Я могу найти правильные имена (то есть имена с наименьшим количеством баллов), но они напечатаны в неправильном порядке)

Ответы [ 3 ]

0 голосов
/ 23 марта 2020

Таким образом, вместо использования двух списков, вы можете сопоставить результаты с именем с указанием. Вот так:


scores_dict = {'Harry': 37.21,
          'Berry': 37.21,
          'Tina': 37.2,
          'Akriti': 41,
          'Harsh': 39
          }

Затем удалите все соответствующие ключи из начального минимального значения, чтобы мы могли получить вторую минуту

x = min(scores_dict, key=scores_dict.get)
filtered_scores = {k:v for k,v in scores_dict.items() if v != scores_dict[x]}

Затем мы берем все ключи любого из новых минимальное значение.

x = min(filtered_scores, key=scores_dict.get)
res = [key for key in filtered_scores if filtered_scores[key] == filtered_scores[x]]

Полный код

n = int(input)
scores_dict = {}
for _ in range(n):
    name = input()
    score = int(input())
    scores_dict[name] = score

# The loop will produce this dict
'''
scores_dict = {'Harry': 37.21,
          'Berry': 37.21,
          'Tina': 37.2,
          'Akriti': 41,
          'Harsh': 39
          }
'''

x = min(scores_dict, key=scores_dict.get)
filtered_scores = {k:v for k,v in scores_dict.items() if v != scores_dict[x]}

x = min(filtered_scores, key=scores_dict.get)
res = [key for key in filtered_scores if filtered_scores[key] == filtered_scores[x]]

print(res)

Если вы действительно хотите использовать два списка, это можно сделать, но это увеличивает вероятность ошибок, добавляя ненужную сложность.

Словари - это просто ассоциативные (именованные) массивы (списки).

0 голосов
/ 23 марта 2020
n = int(input())
a_name = []
a_score = []
for _ in range(n):
    name = input()
    score = float(input())
    a_name.append(name)
    a_score.append(score)
a_score1 = set(a_score)
a_score1.remove(min(a_score1))
x = min(a_score1)
y =[]
for i in range(n):
    if a_score[i]==x:
        y.append(a_name[i])
y.sort()
for j in range(len(y)):
    print(y[j])

Я получил вывод с этим кодом. Спасибо всем за помощь!

0 голосов
/ 23 марта 2020

вы можете сначала найти второй минимум, а затем найти имена, имеющие второй минимум, используя понимание списка и встроенную функцию zip :

second_minim = sorted(a_score)[1]
[n for n, s in zip(a_name, a_score) if s == second_minim]

output:

['Harry', 'Berry']

связано с тем, почему должно быть ['Berry', 'Harry'] вместо ['Harry', 'Berry'] в соответствии с требованиями , которые вы указали:

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

, поэтому вы должны использовать:

result = sorted(n for n, s in zip(a_name, a_score) if s == second_minim)

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

вывод:

Berry
Harry
...