从字典B(深德尔)中减去字典A?

时间:2010-01-20 10:42:33

标签: python dictionary

如果我有一个深度嵌套的dict有一个内置的方法来减去/删除“路径”列表(例如:keyA.keyB.key1,keyA.keyC.key2等)或一秒钟的键来自原始字典的字典?或者也许有一个具有这种功能的通用模块?

3 个答案:

答案 0 :(得分: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}}

您可能也想介绍一些错误检查。

答案 1 :(得分: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]

答案 2 :(得分: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}