Скажем, у вас есть словарь словарей, но вы хотите скопировать почти всю структуру (за исключением значений самых внутренних словарей). Следующий код может делать то, что я хочу, но я уверен, что есть более разумный способ сделать это:копировать сложную структуру словаря
import sys
def main(argv=()):
# original dictionary
data = {1:{'l1': [1,2,3], 'l2': [2,1,6]}, 2: {'t1': ("w?",2), 't2': ("h!",4)}}
# new values for the innermost keys
newd = {'l1' : 1, 'l2' : 2, 't1' : 3, 't2' : 4}
copy = dict.fromkeys(data.keys(), {})
for k in copy.keys():
copy[k] = dict.fromkeys(data[k].keys(), None)
for k in copy.values():
for e in k.keys():
k[e] = newd[e]
print(data)
print(copy)
if __name__ == "__main__":
sys.exit(main())
Так код выше принтами:
{1: {'l2': [2, 1, 6], 'l1': [1, 2, 3]}, 2: {'t1': ('w?', 2), 't2': ('h!', 4)}}
{1: {'l2': 2, 'l1': 1}, 2: {'t1': 3, 't2': 4}}
и это результат я ожидал, и но код выше кажется слишком подробным. Одно из предостережений заключается в том, что в реальном примере значения для самых внутренних ключей не так просты, но они являются массивными массивами, поэтому я не хочу делать глубокую копию всей структуры и затем заменять эти значения.
Пожалуйста, прочитайте мои последние комментарии по глубокому копированию. – aaragon
Извините, материал про массивы numpy. Но, тем не менее, я сказал вам, что делать. Посмотрите, как работает модуль копирования, затем напишите аналогичный алгоритм, который будет учитывать ваши спецификации. Это была суть моего ответа. Кроме того, модуль копирования является гибким, и вы можете контролировать выполняемое копирование, особенно при использовании ваших собственных объектов. – Dalen