#python-3.x #list #dictionary #reference #variable-assignment
Вопрос:
У меня есть список ценностей:
list = [value1, value2, value3]
И список словарей, в которых на определенных клавишах я должен задать соответствующие значения:
dictionaries = [{"key1":{"key2":{"key3":position_value1}}},{"key1":{"key2":{"key3":position_value2}}}]
Я пытаюсь присвоить значения, избегая решений, которые требуют явной итерации по числовым индексам списка и словарей.
Я нахожу следующее псевдо-решение, повторяющее две итерации одновременно, используя циклы для каждого
for (dict, value) in zip(dictionaries, list):
dict['key1']['key2']['key3'] = value
print(dictionaries)
Но не работает из-за того, что все словари принимают только последнее значение из списка значений, получая следующий результат:
[{"key1":{"key2":{"key3":position_value3}}},{"key1":{"key2":{"key3":position_value3}}}]
Важно отметить, что при создании списка словарей использовался метод dict.copy (), но, возможно, это не влияет на ссылку, выделенную во вложенных словарях.
Создание списка словарей
base_dict = {"key1": {"key2":{"key3": None}}}
dictionaries = [base_dict.copy() for n in range(3)]
Я ценю любое компактное решение, даже решения, основанные на распаковке.
Комментарии:
1. Покажите код для того, как вы создали список словарей.
Ответ №1:
base_dict = {"key1": {"key2":{"key3": None}}}
dictionaries = [base_dict.copy() for n in range(3)]
Создадим неглубокие копии base_dict
. Это означает, что, хотя они независимы на верхнем уровне, их значения копируются по ссылке; следовательно, внутренние словари {"key2":{"key3": None}}
по-прежнему являются одним и тем же объектом. При повторной привязке key3
будут затронуты все ссылки.
Вы можете избежать этого, сделав deepcopy
:
from copy import deepcopy
dictionaries = [deepcopy(base_dict) for _ in range(3)]
Комментарии:
1. До тех пор, пока
base_dict
это просто и используется только один раз, хорошей альтернативой будет[{"key1": {"key2":{"key3": None}}} for _ in range(3)]