Как добавлять элементы из одного словаря в другой? Python

#python #dictionary

#python #словарь

Вопрос:

У меня есть основной словарь.

 mainDict = {'count': 10, 'a': {'abc': {'additional': 0, 'missing': 0, 'changed': 0}}}
 

Теперь у меня есть новый словарь с теми же ключами, что и в mainDict, который называется этим словарем как b с разными значениями.

 b = {'count': 20, 'a': {'abc': {'additional': 10, 'missing': 10, 'changed': 10}}}
 

Я хочу обновить (операция добавления) значения ключей в основном словаре, поэтому я это делаю..

 mainDict = {'count': mainDict['count']   b['count'], 'a': }
 

Я застрял при обновлении значений key a . Если я использую mainDict.update(b), то он заменит предыдущие значения. Любое эффективное решение??

Требуемый конечный результат:

 mainDict = {'count': 30, 'a': {'abc': {'additional': 10, 'missing': 10, 'changed': 10}}}
 

Спасибо

Комментарии:

1. So b имеет ту же структуру , mainDict что и, и вы хотите рекурсивно сопоставлять значения и суммировать их?

Ответ №1:

 def recursive_dict_sum_helper(v1, v2):
    # "add" two values: if they can be added with ' ', then do so,
    # otherwise expect dictionaries and treat them appropriately.
    try: return v1   v2
    except: return recursive_dict_sum(v1, v2)

def recursive_dict_sum(d1, d2):
    # Recursively produce the new key-value pair for each
    # original key-value pair, and make a dict with the results.
    return dict(
        (k, recursive_dict_sum_helper(v, d2[k]))
        for (k, v) in d1.items()
    )

mainDict = recursive_dict_sum(mainDict, b)
 

Комментарии:

1. Большое спасибо, это работает очень хорошо 🙂 Хотел бы я быть таким мастером в Python, как вы : (

Ответ №2:

Я бы написал:

 def sum_dicts_recursive(d1, d2):
    for k, v1 in d1.items():
        if isinstance(v1, dict):
            yield (k, dict(process(v1, d2[k])))
        else:
            yield (k, v1   d2[k])

result = dict(sum_dicts_recursive(mainDict, b))
# {'count': 30, 'a': {'abc': {'changed': 10, 'additional': 10, 'missing': 10}}}
 

Обратите внимание, что это sum_dicts_recursive может быть writter как однострочное выражение генератора, но это, вероятно, будет сложнее понять.