Python 使用键字符串列表作为路径添加到dict

Python 使用键字符串列表作为路径添加到dict,python,dictionary,path,key,Python,Dictionary,Path,Key,我有以下意见: aDict = { "a" : { "b" : { "c1" : {}, "c2" : {}, } } } 第二条格言: aSecondDict = { "d1" : {}, "d2" : {}, "d3" : {}, } 和“路径”元组: 现在,我想在元组提供的路径上将第二个dict添加到第一个dict: aResultDict = { "a"

我有以下意见:

aDict = {
    "a" : {
        "b" : {
            "c1" : {},
            "c2" : {},
        }
    }
}
第二条格言:

aSecondDict = { 
    "d1" : {},
    "d2" : {},
    "d3" : {},
}
和“路径”元组:

现在,我想在元组提供的路径上将第二个dict添加到第一个dict:

aResultDict = {
    "a" : {
        "b" : {
            "c1" : {},
            "c2" : {
                "d1" : {},
                "d2" : {},
                "d3" : {},
            },
        }
    }
}

实现这一点的python方法是什么?

您可以使用
reduce
1获取字典,并使用
dict.update
将新内容放入其中:

reduce(lambda d,key: d[key],path,aDict).update(aSecondDict)
如果你愿意,你甚至可以变得更聪明一点:

reduce(dict.__getitem__,path,aDict).update(aSecondDict)
我想应该指出的是,这两种方法略有不同。后者强制
aDict
只包含更多的字典(或
dict
子类),而前者允许在
aDict
中包含
\uuuu getitem\uuuuuuu
方法的任何内容,您还可以使用:

reduce(dict.get,path,aDict).update(aSecondDict)
但是,如果您尝试遍历路径中不存在的“链接”,而不是
键错误,则此版本将引发
AttributeError
,因此我不太喜欢它。此方法还强制沿路径的每个值都是
dict
dict
子类


1
reduce
是python2.x的内置代码。从python2.6开始,它还可以作为
functools.reduce提供。想要与python3.x兼容的代码应该尝试使用functools.reduce作为python3.x中的内置项被删除

你能修复你的字典吗?或者reduce(dict.get,path,d)@jamylak--对。初始值设定项总是最后一个。谢谢。如果OP想要一份拷贝,他可以使用
copy.deepcopy
然后执行this@jamylak--我想我更喜欢
dict.\uuu getitem\uuuu
而不是
dict.get
,因为前者在路径不好时会引发
KeyError
,但后者会引发
AttributeError
(我想)这似乎没什么帮助。@jamylak——我从来没有保证过我的理智:-)
reduce(dict.get,path,aDict).update(aSecondDict)