Как добавить значения в виде словаря, не заменяя прошлое значение?
Проблема состоит в том что я не понимаю как нормально создать вложенный словарь. Значений несколько под одним ключом, но при работе функции значения перекрывают друг друга и остается только один словарь под ключом. Данные берутся из списка словарей где каждый словарь это параметры и оценки студента.
UPD: Пример входных данных
students = [
{'Фамилия': "Иванов", 'Имя': 'Иван', 'Отчество': 'Иванович', 'Год рождения': 2003, 'Курс': 1, 'Группа': '219-2',
'Оценки': {'ООП': 4, 'БД': 3, 'Экология': 5, 'Химия': 2, 'История': 4}},
{'Фамилия': "Петров", 'Имя': 'Петр', 'Отчество': 'Петрович', 'Год рождения': 2001, 'Курс': 1, 'Группа': '219-1',
'Оценки': {'ООП': 3, 'БД': 2, 'Экология': 1, 'Химия': 5, 'История': 4}},
{'Фамилия': "Денисов", 'Имя': 'Денис', 'Отчество': 'Денисович', 'birth_year': 2001, 'Курс': 1,
'Группа': '219-2',
'Оценки': {'ООП': 3, 'БД': 5, 'Экология': 5, 'Химия': 5, 'История': 5}},
{'Фамилия': "Алексеев", 'Имя': 'Алексей', 'Отчество': 'Алексеевич', 'Год рождения': 2002, 'Курс': 2,
'Группа': '219-1',
'Оценки': {'ООП': 3, 'БД': 2, 'Экология': 1, 'Химия': 2, 'История': 3}},
{'Фамилия': "Сергеев", 'Имя': 'Сергей', 'Отчество': 'Сергеевич', 'Год рождения': 2002, 'Курс': 3,
'Группа': '219-2',
'Оценки': {'ООП': 3, 'БД': 2, 'Экология': 4, 'Химия': 2, 'История': 1}}
]
Функция
def func(students):
unqile = set([d['Группа'] for d in students])
dict_3 = {}
for x in unqile:
for i in [d['Оценки'] for d in students]:
for el in students:
if el['Группа'] == x:
dict_3[x] =(i)
return dict_3
На выходе:
{'219-2': {'ООП': 3, 'БД': 2, 'Экология': 4, 'Химия': 2, 'История': 1}, '219-1': {'ООП': 3, 'БД': 2, 'Экология': 4, 'Химия': 2, 'История': 1}}
А необходимо :
{'219-2': {'ООП': 3, 'БД': 2, 'Экология': 4, 'Химия': 2, 'История': 1}, {'ООП': 3, 'БД': 5, 'Экология': 5, 'Химия': 5, 'История': 5},{'ООП': 3, 'БД': 2, 'Экология': 4, 'Химия': 2, 'История': 1}
'219-1': {'ООП': 3, 'БД': 2, 'Экология': 4, 'Химия': 2, 'История': 1},{'ООП': 3, 'БД': 2, 'Экология': 1, 'Химия': 2, 'История': 3}}
Ответы (2 шт):
В словарь нельзя добавить значение уже существующему ключу без удаления предыдущего значение. Один ключ - одно значение. Это закон! Но к счастью для вас значением может быть список, а списке может быть много значений. Этим мы и воспользуемся, заодно убрав все ненужные циклы:
def func(students):
unqile = set([d['Группа'] for d in students])
dict_3 = {x:[] for x in unqile} # пустой словарь с ключами из названий групп
for student in students:
dict_3[student['Группа']].append(student['Оценки'])
return dict_3
На выходе получается словарь, в котором значениями являются списки
{
'219-2': [{'ООП': 4, 'БД': 3, 'Экология': 5, 'Химия': 2, 'История': 4},
{'ООП': 3, 'БД': 5, 'Экология': 5, 'Химия': 5, 'История': 5},
{'ООП': 3, 'БД': 2, 'Экология': 4, 'Химия': 2, 'История': 1}],
'219-1': [{'ООП': 3, 'БД': 2, 'Экология': 1, 'Химия': 5, 'История': 4},
{'ООП': 3, 'БД': 2, 'Экология': 1, 'Химия': 2, 'История': 3}]
}
Если провести небольшой рефакторинг, можно обойтись только одним циклом без лишних действий это будет быстрее:
def get_groups_marks(students):
result = {}
for student in students:
group = student['Группа']
marks = student['Оценки']
if (group in result):
result[group].append(marks)
else:
result[group] = [marks]
return result