Необходимо добавить / удалить key-val, если ключ не существует для вложенного словаря глубины переменных - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть два вложенных словаря переменной глубины orig_dict, new_dict

orig_dict = {"a":1, "b":[{"c":{"d":2}, "e":[{"q":12}, {"a":2}]}, {"h":[1,2,3,4]}], "e":{"we":12}}
new_dict = {"a":2, "b":[{"c":{"d":3}, "e":[{"q":120}, {"a":2}, {"x":10000}]}], "e":{"we":12}, "f":100}

Здесь new_dict - обновления, которые необходимо выполнить в orig_dict,

  1. если ключ не существует, добавьте этот ключ-значение в orig_dict
  2. , если ключ в orig_dict не существует в new_dict, затем удалите ключ-значение из orig_dict
  3. если ключ соответствует пропущенным изменениям

У меня есть код, который будет обрабатывать только словари в качестве значений, но не список

import collections
def map_and_update(orig_dict, new_dict):
    for key, val in new_dict.items():
        if isinstance(val, collections.Mapping):
            tmp = updatee(orig_dict.get(key, { }), val)
            orig_dict[key] = tmp
        else:
            orig_dict[key] = new_dict[key]
    return orig_dict

это приведет к:

{'a': 2, 'b': [{'c': {'d': 3}, 'e': [{'q': 120}, {'a': 2}, {'x': 10000}]}], 'e': {'we': 12}, 'f': 100}

но я ожидаю

{'a': 1, 'b': [{'c': {'d': 2}, 'e': [{'q': 12}, {'a': 2}, {'x': 10000}]}], 'e': {'we': 12}, 'f': 100}

Примечание. Выше я просто копирую значение new_dict в orig_dict, если вижу список, но он должен анализировать список даже ипроверьте, существует ли dict или нет, затем снова выполните map

1 Ответ

0 голосов
/ 06 ноября 2019

Этот мой код, возможно, не очень читабелен, но, по крайней мере, он завершил работу. У меня сейчас нет времени, но если кто-нибудь захочет, чтобы я объяснил, я отредактирую этот пост позже.

orig_dict = {"a":1, "b":[{"c":{"d":2}, "e":[{"q":12}, {"a":2}]}, {"h":[1,2,3,4]}], "e":{"we":12}}
new_dict = {"a":2, "b":[{"c":{"d":3}, "e":[{"q":120}, {"a":2}, {"x":10000}]}], "e":{"we":12}, "f":100}


for key, value in new_dict.items():
    if isinstance(value, list):
        for key1, value1 in new_dict['b'][0].items():
            if orig_dict['b'][0].get(key1):
                pass
            if len(new_dict['b']) != len(orig_dict['b']):
                del orig_dict['b'][len(new_dict['b']):]
            length = len(new_dict['b'][0]['e'])
            for i in range(length):
                for k, v in new_dict['b'][0]['e'][i].items():
                    try:
                        if orig_dict['b'][0]['e'][i].get(k):
                            pass
                        else:
                            orig_dict['b'][0]['e'][i][k]=v
                    except:
                        orig_dict['b'][0]['e'].append({k:v})
    elif orig_dict.get(key):
        pass
    else:
        orig_dict[key]=value


print(orig_dict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...