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
子类
1reduce
是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)