Добавление новой пары (ключ, значение) во вложенный словарь - python3 - PullRequest
1 голос
/ 02 мая 2020

Привет, я создал (что я называю) вложенный словарь:

gradeDict = { 
   "Intro to Programming":{ 
      "student":{ 
         "firstname":"Mike",
         "lastname":"Miller",
         "marks":{ 
            "PS01":70,
            "PS02":80
         }
      }
   }
}
print(gradeDict['Intro to Programming']['student']['marks'])

, который после запроса значений в ключевых «метках» дает значения

{'PS01': 70, 'PS02': 80}

Это прекрасно , Теперь я хочу добавить НОВУЮ пару (ключ, значение) в 'метки' старшего ключа:

gradeDict.update( {"Intro to Programming":{ "student":{ "firstname":"Mike",
         "lastname":"Miller","marks":{ "PS03":10}}}} )

print(gradeDict['Intro to Programming']['student']['marks'])

К сожалению, это дает

{'PS03': 10}

, который я не понимаю, ключ следует перезаписывать, только если он уже существует, в противном случае добавляется. «метки» существуют, но «PS03» нет. Что мне здесь не хватает, или как получить нужную запись:

{'PS01': 70, 'PS02': 80, 'PS03': 10}

Спасибо большое ...

1 Ответ

1 голос
/ 02 мая 2020

Хорошие рассуждения, но 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}}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...