#python #python-3.x #loops
#python #python-3.x #циклы
Вопрос:
Это проблема python, в которой предполагалось, что код позволит вам ввести n количество имен и оценок, и программа вернет имя или имена тех, у кого второй наименьший балл. Это то, с чем я столкнулся, и это работает отлично, но в интересах улучшения мне было интересно, есть ли какие-либо более простые способы добиться этого. Мой код приведен ниже.
n=int(input())
names=[]
for i in range(0,n):
names.append([input(),float(input())])
for i in range(0,n):
names[i].reverse()
names.sort()
names.reverse()
misc=[]
for i in range(0,n):
misc.append(names[i][0])
blank=[]
for i in misc:
if i not in blank:
blank.append(i)
blank.reverse()
vals=[]
for i in range(0,n):
if names[i][0]==blank[1]:
vals.append(names[i])
vals.reverse()
for i in range(0,len(vals)):
print(vals[i][1])
Комментарии:
1. Этот вопрос больше подходит для codereview.stackexchange.com . Пожалуйста, разместите его там
2. Вы можете использовать
misc = list(set(misc))
для быстрого удаления дубликатов. Но вам придется сортировать его снова. В этом случае вам не нужно сортировать имена.3. @Goion: вопрос нуждается в доработке, прежде чем он подойдет для проверки кода . Вы должны были указать спрашивающему на руководство по проверке кода для пользователей Stack Overflow , поскольку там некоторые вещи выполняются по-другому — например, нам нужно хорошее описание назначения кода, чтобы дать контекст, а заголовки вопросов должны просто указывать, что делает код (вопрос всегда в том, «Какмогу ли я улучшить это? «). Важно, чтобы код работал правильно; если возможно, включите модульные тесты.
Ответ №1:
Во-первых, структура может быть значительно упрощена с помощью dicts.
Начните с получения имен dict по сравнению с оценками. например:
name_to_score = {
"alice": 1.2,
"bob": 1.1,
"fred": 1.3,
"nancy": 1.2,
}
Затем возьмите этот dict и инвертируйте его, чтобы получить dict из оценок и имен:
score_to_names = {
1.2: ["alice", "nancy"],
1.1: ["bob"],
1.3: ["fred"],
}
Вы можете найти второй наименьший балл (ключ) и распечатать значения из перевернутого dict .
Ваша реализация может выглядеть примерно так:
from collections import defaultdict
name_to_score = {}
for _ in range(int(input())):
name_to_score[input()] = float(input())
score_to_names = defaultdict(list)
for name, score in name_to_score.items():
score_to_names[score].append(name)
second_lowest_score = sorted(score_to_names.keys())[1]
print(score_to_names[second_lowest_score])
Вы также можете начать с создания score_to_names
dict сразу:
from collections import defaultdict
score_to_names = defaultdict(list)
for _ in range(int(input())):
name = input()
score = float(input())
score_to_names[score].append(name)
second_lowest_score = sorted(score_to_names.keys())[1]
print(score_to_names[second_lowest_score])
Ответ №2:
Ваш код трудно читать. Если вы улучшите читаемость, вам и всем остальным будет легче понять, что происходит.
Первым шагом было бы разделить его на 3 части:
- Получение входных данных от пользователя
- Вычисление результата
- Отображение результата пользователю
Тогда я бы подумал о переименовании переменных. Я не могу сказать, что blank
, misc
и vals
почему вы reverse()
так часто используете.
В pyhton есть min()
встроенные встроенные функции.
Я бы объединил его с defaultdict
from collections
и использовал их так:
from collections import defaultdict
scores_names = defaultdict(list) # {3:["Johny", "Sanny"], 4:[Ben]}
# Getting input from a user
n = int(input("n:"))
for i in range(0, n):
scores_names[float(input("score:"))].append(input("name:"))
# Calculating the result
min_score = min(scores_names.keys())
result = scores_names[min_score]
# Displaying result to a user
print(result)
Консоль:
n:3
score:3
name:Johny
score:3
name:Sanny
score:4
name:Ben
['Johny', 'Sanny']
Если вы хотите, чтобы ваш код выглядел красиво и соответствовал PEP8, рассмотрите возможность использования черного цвета
Если вы хотите узнать больше о том, как провести рефакторинг, рассмотрите возможность чтения этой книги