10

我有以下字典:

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

第二个字典:

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

和一个“路径”元组:

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

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

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

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

4

1 回答 1

13

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

reduce(lambda d,key: d[key],path,aDict).update(aSecondDict)

如果你愿意,你甚至可以变得更聪明一点:

reduce(dict.__getitem__,path,aDict).update(aSecondDict)

我想应该注意的是,这两种方法略有不同。后者强制aDict只包含更多的字典(或dict子类),而前者允许任何有__getitem__方法的东西在aDict. 如评论中所述,您还可以使用:

reduce(dict.get,path,aDict).update(aSecondDict)

AttributeError但是,如果您尝试遍历路径中不存在而不是 a 的“链接”,则此版本将引发 an ,KeyError因此我不太喜欢它。此方法还强制沿路径的每个值都是一个dictdict子类。

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

于 2013-04-30T12:51:50.383 回答