从字典B中减去字典A(深度删除)?

4 投票
3 回答
2984 浏览
提问于 2025-04-15 18:14

如果我有一个层层嵌套的字典,是否有内置的方法可以从这个字典中减去或移除一系列的“路径”(比如:keyA.keyB.key1,keyA.keyC.key2等等),或者从另一个字典的键中移除这些键?或者有没有什么常用的模块可以实现这样的功能?

3 个回答

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

这里有个建议:

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

还有一种解决方案:

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}

撰写回答