2013-04-30 54 views
9

我有以下字典:添加到字典使用密钥字符串列表作为路径

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

第二字典:

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

和“路径”的元组:

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

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

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

实现此目的的pythonic方式是什么?

+1

删除你能否解决您的字典 – jamylak 2013-04-30 12:48:01

+0

由于马蒂诺:) – 2013-05-02 07:14:14

回答

11

您可以使用reduce 得到字典和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子类。

reduce是python2.x的内置函数。从python2.6开始,它也可以作为functools.reduce。它愿意与python3.x兼容的代码应尽量选用functools.reduce作为内置在python3.x

+0

或'减少(dict.get,路径, d)' – jamylak 2013-04-30 12:53:16

+0

@jamylak - 对。初始化器总是最后一个。谢谢。 – mgilson 2013-04-30 12:54:37

+1

另外,如果OP想要一个副本,他可以使用'copy.deepcopy',然后执行此操作 – jamylak 2013-04-30 12:55:16

相关问题