我有以下词典:
aDict = {
"a" : {
"b" : {
"c1" : {},
"c2" : {},
}
}
}
第二个词:
aSecondDict = {
"d1" : {},
"d2" : {},
"d3" : {},
}
和"路径"元组:
path = ( "a", "b", "c2" )
我现在想要将第二个dict添加到元组提供的路径中的第一个:
aResultDict = {
"a" : {
"b" : {
"c1" : {},
"c2" : {
"d1" : {},
"d2" : {},
"d3" : {},
},
}
}
}
实现这一目标的pythonic方式是什么?
答案 0 :(得分:12)
您可以使用reduce
1 来获取字典,dict.update
将新内容放入其中:
reduce(lambda d,key: d[key],path,aDict).update(aSecondDict)
如果你愿意,你甚至可以更聪明一点:
reduce(dict.__getitem__,path,aDict).update(aSecondDict)
我想应该指出的是,这两种方法略有不同。后者强制aDict
只包含更多字典(或dict
子类),而前者允许任何__getitem__
方法都在aDict
中。 As noted in the comments,你也可以使用:
reduce(dict.get,path,aDict).update(aSecondDict)
但是,如果您尝试遍历不存在的路径中的“链接”而不是AttributeError
,则此版本将引发KeyError
,因此我不太喜欢它。此方法还强制路径中的每个值都是dict
或dict
子类。
1 reduce
是python2.x的内置函数。从python2.6开始,它也可以functools.reduce
获得。想要与python3.x兼容的代码应该尝试使用functools.reduce
,因为在python3.x中删除了内置函数