2010-01-20 38 views
4

如果我有一個深層嵌套的字典,是否有一個內置的方法來減去/刪除「路徑」列表(例如:keyA.keyB.key1,keyA.keyC.key2等)或第二個字典的鍵從原來的字典?或者也許有一個通用模塊具有這樣的功能?從字典B(深del)減去字典A?

+0

「deep del」是什麼意思? – 2010-01-20 14:24:38

+0

深度刪除,就像在特定鍵的一次操作中在嵌套字典上的多個級別使用'del'關鍵字一樣。 – 2010-01-20 21:25:00

回答

1

另一種解決方案:

d = { 
    'A' : { 
     'C' : { 
      'D' : { 
       'E' : 4, 
      }, 
      'F' : 5, 
     }, 
    }, 
    'B' : 2, 
} 

def DeepDictDel(path, dict): 
    for key in path.split('.'): 
     owner = dict 
     dict = dict[key] 

    del owner[key] 


print d # prints {'A': {'C': {'D': {'E': 4}, 'F': 5}}, 'B': 2} 
DeepDictDel('A.C.D', d) 
print d # prints {'A': {'C': {'F': 5}}, 'B': 2} 
+0

這更像我想象中的(如使用「key.key」路徑),但是balpha的答案也很棒。 – 2010-01-21 15:24:50

2

這裏有一個建議:

D = { "keyA": { 
     "keyB" : { 
      "keyC" : 42, 
      "keyD": 13 
      }, 
     "keyE" : 55 
     } 
    } 

def remove_path(dictionary, path): 
    for node in path[:-1]: 
     dictionary = dictionary[node] 
    del dictionary[path[-1]] 

remove_path(D, ["keyA", "keyB", "keyD"]) 

print D # prints {'keyA': {'keyB': {'keyC': 42}, 'keyE': 55}} 

你可能會想介紹一些錯誤檢查,太。

2

萬一其他答案是不是你要找什麼,這裏有一個減去一個字典從另一個。

def subtract(a, b): 
    """ Remove the keys in b from a. """ 
    for k in b: 
     if k in a: 
      if isinstance(b[k], dict): 
       subtract(a[k], b[k]) 
      else: 
       del a[k]