GOOGLE ADS

пятница, 15 апреля 2022 г.

Проблема с изменением вложенных значений dict в Python

У меня проблема с попыткой изменить значения во вложенном словаре:

dictionary = {"2000": {"1.1.1.": 1, "1.2.3.": 5, "1.2.1.": 1}, "2001": {"1.2.3.": 5, "1.1.4.5.": 1}, "2002": {"1.1.1.": 1, "1.2.3.": 10}, "2003": {"1.1.1.": 5, "1.2.3.4.5.6.": 10}}
hierarchies = {"1.1.1.", "1.2.3."}
peryear_values = dict.fromkeys(list(sorted(dictionary.keys())), 0)
h_values = dict.fromkeys(list(hierarchies), peryear_values)
for hierarchy in hierarchies:
for year, values in sorted(dictionary.items()):
if hierarchy in values.keys():
print("\nThe hierarchy: ", hierarchy)
print("In year: ", year)
print("The value: ", values[hierarchy])
h_values[hierarchy][year] = values[hierarchy]
print(h_values)

Желаемый результат:

{"1.1.1.": {"2000": 1, "2001": 0, "2002": 1, "2003": 5}, "1.2.3": {"2000": 5, "2001": 5, "2002": 10, "2003": 0}}

Результат, который я получаю:

{'1.1.1.': {'2000': 5, '2001': 5, '2002': 10, '2003': 5}, '1.2.3.': {'2000': 5, '2001': 5, '2002': 10, '2003': 5}}

Кажется, что для каждой итерации значение обоих ключей «иерархии» изменяется вместо того, чтобы учитывать изменение конкретного. Я что-то делаю не так?

Я использую Python 3.9.7 и Conda 4.12.0.


Решение проблемы

Да. В вашей программе есть только один peryear_valuesдикт. Когда вы создаете h_values, вы просто сохраняете несколько ссылок на этот словарь. Вы не можете использовать dict.fromkeysдля этого. Вам придется использовать цикл и использовать peryear_values.copy().

h_values = dict( (h, peryear_values.copy()) for h in hierarchies )

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...