Задание: сформировать базу данных и посчитать разные средние и лучшие показатели
students = {'ID01':
{
'name': 'Сергей',
'surname': 'Серов',
'sex': 'мужской',
'experience': False,
'homeworks': {'1': 5, '2': 10, '3': 7, '4': 7, '5': 2},
'exam': 7
},
'ID02':
{
'name': 'Сергей',
'surname': 'Иванилов',
'sex': 'мужской',
'experience': True,
'homeworks': {'1': 6, '2': 10, '3': 9, '4': 8, '5': 5},
'exam': 8
},
'ID03':
{
'name': 'Мария',
'surname': 'Серова',
'sex': 'женский',
'experience': False,
'homeworks': {'1': 5, '2': 10, '3': 7, '4': 7, '5': 2},
'exam': 10
},
'ID04':
{
'name': 'Виктория',
'surname': 'Цинберг',
'sex': 'женский',
'experience':True,
'homeworks': {'1': 8, '2': 10, '3': 7, '4': 6, '5': 8},
'exam': 7
},
'ID05':
{
'name': 'Сергей',
'surname': 'Серов',
'sex': 'мужской',
'experience': False,
'homeworks': {'1': 8, '2': 10, '3': 8, '4': 8, '5': 8},
'exam': 10
},
'ID06':
{
'name': 'Маргарита',
'surname': 'Арутунян',
'sex': 'женский',
'experience': True,
'homeworks': {'1': 8, '2': 10, '3': 8, '4': 8, '5': 8},
'exam': 10
}
}
#расчет средних оценок за домашки и экзамен
def ave_group(homework_or_exam, select_dictonary): #функция принимает форму контроля и словарь (полный или отфильтрованный)
sum_score = 0 #объявляем нулевую сумму баллов
quantity = 0 #объявляем нулевой счетчик количества оценок
if homework_or_exam == '1': # если пользователь ввел 1, то отрабатываем средние оценки за домашние задания
for students_info in select_dictonary.values(): #погружаемся в информацию о студентах
for score in students_info['homeworks'].values(): #погружаемся в словарь с оценками и берем оттуда только оценки
sum_score += score #находим сумму оценок
quantity += 1 #находим количество оценок
average = sum_score/quantity
return average
elif homework_or_exam == '2': # если пользователь ввел 2, то отрабатываем средние оценки за экзамен
for students_info in select_dictonary.values(): #погружаемся в информацию о студентах
sum_score += students_info['exam'] #находим сумму оценок
quantity += 1 #находим количество оценок
average = sum_score/quantity
return average
else:
print('Что-то пошло не так...')
#создаем новый словарь фильтруя по полу и опыту
def dictonary_filter(sex, experience): #создаем новый словарь на основе отфильтрованных данных
# sex - допустимые значения: 0 - все, мужской, женский
# experience - допустимые значения: 0 - все, True - с опытом, False - без опыта
new_dict_students = {}
for id_number, new_dict_info in students.items():
if (sex == 0 or new_dict_info['sex'] == sex) and (experience == 0 or new_dict_info['experience'] == experience):
new_dict_students[id_number] = new_dict_info
return new_dict_students
#поиск лучших
def the_best():
best_list = []
max_score = 0
for best_students in students.values():
sum_score = 0 #начинаем расчет средней оценки за домашние задания
quantity = 0
for score in best_students['homeworks'].values():
sum_score += score
quantity += 1
average = sum_score/quantity
score = 0.6 * average + 0.4 * best_students['exam'] #считаем интегральную оценку
if score > max_score: #если и.оценка > максимальной, то обновляем лист лучших
max_score = score
best_list = [[best_students['name'], best_students['surname'], max_score]]
elif score == max_score: #если и.оценка = максимальной, то добавляем в лист лучших
best_list.append([best_students['name'], best_students['surname'], max_score])
if len(best_list) == 1: #если в списке лучших 1, то выводим одно сообщение
print()
print('Лучший студент: {} с интегральной оценкой {:.2f}'.format(best_list[0][0]+' '+best_list[0][1], max_score))
elif len(best_list) > 1: #если в списке лучших >1, то формируем список из имен и фамилий и запускаем print
name_surname_list = []
for students_in_best_list in best_list:
name_surname_list.append(students_in_best_list[0]+' '+students_in_best_list[1])
print()
print('Лучшие студенты: {} с интегральной оценкой {}'.format(', '.join(name_surname_list), max_score))
else:
print('Что-то пошло не так...')
#главная функция
def main():
while True:
command = input('\n\
1 - вывести среднюю оценку за домашние задания и за экзамен по всем группе\n\
2 - вывести среднеюю оценку за домашние задания и за экзамен по группе в разрезе пола и наличия опыта\n\
3 - определить лучшего студента, у которого будет максимальный балл по формуле 0.6 * его средняя оценка за домашние задания + 0.4 * оценка за экзамен\n\
exit - выход\n\
Введите команду: ')
if command == '1':
print('')
print('Средняя оценка за домашние задания по группе: {:.2f}'.format(ave_group('1', students)))
print('Средняя оценка за экзамен по группе: {:.2f}'.format(ave_group('2', students)))
elif command == '2':
print('')
print('Средняя оценка за домашние задания у мужчин: {:.2f}'.format(ave_group('1', dictonary_filter('мужской', 0))))
print('Средняя оценка за экзамен у мужчин: {:.2f}'.format(ave_group('2', dictonary_filter('мужской', 0))))
print('Средняя оценка за домашние задания у женщин: {:.2f}'.format(ave_group('1', dictonary_filter('женский', 0))))
print('Средняя оценка за экзамен у женщин: {:.2f}'.format(ave_group('2', dictonary_filter('женский', 0))))
print('Средняя оценка за домашние задания у студентов с опытом: {:.2f}'.format(ave_group('1', dictonary_filter(0, True))))
print('Средняя оценка за экзамен у студентов с опытом: {:.2f}'.format(ave_group('2', dictonary_filter(0, True))))
print('Средняя оценка за домашние задания у студентов без опыта: {:.2f}'.format(ave_group('1', dictonary_filter(0, False))))
print('Средняя оценка за экзамен у студентов без опыта: {:.2f}'.format(ave_group('2', dictonary_filter(0, False))))
elif command == '3':
the_best()
elif command == 'exit':
break
else:
print()
print('Вы ввели некорректную команду, повторите ввод.')
main()
Полезные заметки:
- как избавиться от [ ] и опубликовать список через запятую: ‘, ‘.Join(list)
- как опубликовать число с N знаками после запятой: {:.2f}.format(x)
- работа со словарями dict.values() — достаем значений, dict.keys() — достаем ключи, dict.items() — достаем ключи и значения в виде кортежа: (ключ, значение)