#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 как однострочное выражение генератора, но это, вероятно, будет сложнее понять.