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

时间:2013-04-30 12:47:00

标签: python dictionary path key

我有以下词典:

aDict = {
    "a" : {
        "b" : {
            "c1" : {},
            "c2" : {},
        }
    }
}

第二个词:

aSecondDict = { 
    "d1" : {},
    "d2" : {},
    "d3" : {},
}

和"路径"元组:

path = ( "a", "b", "c2" )

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

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

实现这一目标的pythonic方式是什么?

1 个答案:

答案 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,因此我不太喜欢它。此方法还强制路径中的每个值都是dictdict子类。

1 reduce是python2.x的内置函数。从python2.6开始,它也可以functools.reduce获得。想要与python3.x兼容的代码应该尝试使用functools.reduce,因为在python3.x中删除了内置函数