Любой способ сделать это проще? Python

#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, рассмотрите возможность использования черного цвета

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