2013-04-30 52 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

相關問題