Назначьте значения из списка определенным значениям в списке словарей

#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)]