Попробуй как то так:
subjects = []
users = {}
def add_subjects():
while True:
subj = input("Введите название предмета: ")
if subj:
subjects.append(subj)
else:
break
print("Список предметов: ")
for predmet in subjects:
print(predmet)
print()
def add_users():
while True:
username = input("Введите данные пользователя: ")
if username:
users[username] = {x: [] for x in subjects}
else:
break
print("Список пользователей:")
for user in users:
print(user)
print()
def append_grades(user_name):
user = users.get(user_name)
if user:
print(f"Введите оценки пользователя {user_name}: ")
graded_subjects = set()
while len(graded_subjects) != len(user):
for predmet in user:
if predmet not in graded_subjects:
try:
grade = input(f"{predmet}: ")
if grade:
users[user_name][predmet].append(int(grade))
graded_subjects.add(predmet) # Mark subject as graded
except ValueError:
print("Оценка должна быть целым числом")
def update_users():
user = None
user_list = {index: name for index, name in enumerate(users.keys(), start=1)}
while True:
user_name = input("Введите имя студента(* выбрать из списка): ")
if user_name == "*":
for user_id, user_name in user_list.items():
print(f"[{user_id}]: {user_name}")
try:
user_id = int(input("Выберите студента:"))
if user_id:
user = user_list.get(user_id)
if not user:
print("Такого номера нет в списке!")
except ValueError:
print("Номер должен быть целым числом!")
elif user_name:
if users.get(user_name):
user = user_name
else:
break
if user:
append_grades(user)
# Заполним список предметов
add_subjects()
# Заполним список пользователей
add_users()
# Заполним список оценок
update_users()
# Вывод результатов
best_user = None
best_average = 0
best_details = {}
for user_name, subjs in users.items():
if all(subjs.values()):
total_average = sum(sum(grades) for grades in subjs.values()) / sum(len(grades) for grades in subjs.values())
if total_average > best_average:
best_user = user_name
best_average = total_average
for predmet, grades in subjs.items():
best_details[predmet] = sum(grades) / len(grades)
print(f"Студент с лучшей успеваемостью: {best_user}: {best_average}")
print("Средний балл по предмету:")
for predmet, average in best_details.items():
print(f"{predmet}: {average}")
Если параметры ввода пользователей через “;” строгие - то добавь уже сам.
Пример работы скрипта:
Введите название предмета: Математика
Введите название предмета: Труды
Введите название предмета:
Список предметов:
Математика
Труды
Введите данные пользователя: Олег Иванов
Введите данные пользователя: Иван
Введите данные пользователя:
Список пользователей:
Олег Иванов
Иван
Введите имя студента(* выбрать из списка): *
[1]: Олег Иванов
[2]: Иван
Выберите студента:1
Введите оценки пользователя Олег Иванов:
Математика: 10
Труды: 10
Введите имя студента(* выбрать из списка): Иван
Введите оценки пользователя Иван:
Математика: 5
Труды: 6
Введите имя студента(* выбрать из списка):
{'Олег Иванов': {'Математика': [10], 'Труды': [10]}, 'Иван': {'Математика': [5], 'Труды': [6]}}
Студент с лучшей успеваемостью: Олег Иванов: 10.0
Средний балл по предмету:
Математика: 10.0
Труды: 10.0