2010-01-20 68 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]