Хорошие рассуждения, но dict.update
не совсем так работает. Он не проверяет рекурсивно каждый элемент, вместо этого он видит, что ключ "Intro to Programming"
уже существует в первом слое, поэтому он перезаписывает его значение с помощью {"student":{ "firstname":"Mike", "lastname":"Miller","marks":{ "PS03":10}}}
.
См. Эту демонстрацию:
gradeDict = {
"Intro to Programming":{
"student":{
"firstname":"Mike",
"lastname":"Miller",
"marks":{
"PS01":70,
"PS02":80
}
}
}
}
gradeDict.update(
{"Intro to Programming": {"NEW VALUE": {"firstname": "Mike", "lastname": "Miller","marks": {"PS03": 10}}}}
)
print(gradeDict)
Вывод:
{'Intro to Programming': {'NEW VALUE': {'firstname': 'Mike', 'lastname': 'Miller', 'marks': {'PS03': 10}}}}
Если вы хотите рекурсивное обновление такого рода, быстрый поиск Google найдет, например, этот (адаптированный для работы с Python 3, экстенсивно не тестировался):
from collections.abc import Mapping
def dict_merge(dct, merge_dct):
for k, v in merge_dct.items():
if (k in dct and isinstance(dct[k], dict)
and isinstance(merge_dct[k], Mapping)):
dict_merge(dct[k], merge_dct[k])
else:
dct[k] = merge_dct[k]
gradeDict = {
"Intro to Programming":{
"student":{
"firstname":"Mike",
"lastname":"Miller",
"marks":{
"PS01":70,
"PS02":80
}
}
}
}
dict_merge(gradeDict, {"Intro to Programming": {"student": {"firstname": "Mike", "lastname": "Miller","marks": {"PS03": 10}}}})
print(gradeDict)
Выход:
{'Intro to Programming': {'student': {'firstname': 'Mike', 'lastname': 'Miller', 'marks': {'PS01': 70, 'PS02': 80, 'PS03': 10}}}}