Python 复制复杂字典结构

Python 复制复杂字典结构,python,dictionary,copy,deep-copy,Python,Dictionary,Copy,Deep Copy,假设您有一个字典字典,但您希望复制几乎整个结构(最里面的字典的值除外)。下面的代码可以做我想做的,但我相信有一种更聪明的方法可以做到这一点: 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 ke

假设您有一个字典字典,但您希望复制几乎整个结构(最里面的字典的值除外)。下面的代码可以做我想做的,但我相信有一种更聪明的方法可以做到这一点:

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}}
这就是我期望的结果,但是上面的代码似乎太冗长了。需要注意的是,在实际示例中,最里面的键的值并没有那么简单,但它们是numpy数组,因此我不想对整个结构进行深度复制,然后替换这些值。

您可以使用(假设代码中的python 3):

如果100%确定每个键都在
newd
中,则可以将
newd.get(内键,内键[inner\u key])
简化为
newd[inner\u key]
。或转到
newd.get(内_键)
如果您不关心AO,但丢失了不在
newd
中的值,请使用复制模块:

import copy
data = {1:{'l1': [1,2,3], 'l2': [2,1,6]}, 2: {'t1': ("w?",2), 't2': ("h!",4)}}
cdata = copy.deepcopy(data)
然后,您必须使用新值修改副本中的最后一个dict

请参阅“复制”模块以了解深度和浅层复制

如果您打算手工操作以避免填充最后一层,递归就是一种方法

请至少了解复制模块是如何实现的,并使用dict.copy()方法,而不是使用fromkeys()构造新的dict

使用循环来实现这一点限制了您对所列字典的确切数量。
如果词典具有固定形状,则使用循环。

使用您自己的代码,您不需要在任何地方调用.keys,您可以在第一个循环中创建词典:

def main():

    # 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, {})
    for k in copy:
        copy[k] = {key:newd[key] for key in data[k]}

对不起,关于numpy阵列的东西错过了。但是,我还是告诉过你该怎么做。去看看复制模块是如何工作的,然后编写类似的algo,它将考虑您的规范。这就是我回答的要点。另外,“复制”模块非常灵活,您可以控制某些复制操作,尤其是在使用自己的对象时。
def main():

    # 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, {})
    for k in copy:
        copy[k] = {key:newd[key] for key in data[k]}