Вычесть dict A из dict B (Deep Del)? - PullRequest
4 голосов
/ 20 января 2010

Если у меня есть глубоко вложенный запрос, есть ли встроенный способ вычитать / удалять список «путей» (например, keyA.keyB.key1, keyA.keyC.key2 и т. Д.) Или ключи диктовать от оригинала диктовать? Или, может быть, есть общий модуль с такой функциональностью?

Ответы [ 3 ]

2 голосов
/ 20 января 2010

На тот случай, если другие ответы не соответствуют вашим требованиям, вот тот, который вычитает один словарь из другого.

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 голосов
/ 20 января 2010

Вот предложение:

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 голос
/ 20 января 2010

Другое решение:

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...