![](/img/trans.png)
[英]Nested dictionaries in python with error when accessing non-existent key
[英]How to Merge and Sum Values of 2 Nested Dictionaries and Keep the non-existent Key:Value Pairs
我有2個字典如下;
字典1;
{ 'y2019': { 'M09': { 'Day 20': { 'lane_1': Decimal('833'),
'lane_2': Decimal('1041'),
'lane_3': Decimal('4702'),
'lane_4': Decimal('5038'),
'total': Decimal('11614')},
'lane_1': Decimal('1519'),
'lane_2': Decimal('1872'),
'lane_3': Decimal('8886'),
'lane_4': Decimal('9195'),
'total': Decimal('21472')},
'M10': { 'Day 01': { 'lane_1': Decimal('530'),
'lane_2': Decimal('632'),
'lane_3': Decimal('3964'),
'lane_4': Decimal('3756'),
'total': Decimal('8882')},
'Day 12': { 'lane_1': Decimal('355'),
'lane_2': Decimal('331'),
'lane_3': Decimal('3062'),
'lane_4': Decimal('3066'),
'total': Decimal('6814')},
'Day 16': { 'lane_1': Decimal('551'),
'lane_2': Decimal('638'),
'lane_3': Decimal('3770'),
'lane_4': Decimal('3738'),
'total': Decimal('8697')},
'lane_1': Decimal('1436'),
'lane_2': Decimal('1601'),
'lane_3': Decimal('10796'),
'lane_4': Decimal('10560'),
'total': Decimal('24393')},
'M11': { 'Day 03': { 'lane_1': Decimal('524'),
'lane_2': Decimal('599'),
'lane_3': Decimal('3370'),
'lane_4': Decimal('3247'),
'total': Decimal('7740')},
'lane_1': Decimal('524'),
'lane_2': Decimal('599'),
'lane_3': Decimal('3370'),
'lane_4': Decimal('3247'),
'total': Decimal('7740')},
'lane_1': Decimal('5870'),
'lane_2': Decimal('5992'),
'lane_3': Decimal('36947'),
'lane_4': Decimal('35423'),
'total': Decimal('84232')}}
字典2;
{ 'y2019': { 'M09': { 'Day 12': { 'lane_1': 686,
'lane_2': 831,
'lane_3': 4184,
'lane_4': 4157,
'total': 9858},
'lane_1': 686,
'lane_2': 831,
'lane_3': 4184,
'lane_4': 4157,
'total': 9858},
'lane_1': 686,
'lane_2': 831,
'lane_3': 4184,
'lane_4': 4157,
'total': 9858}}
我想總結dict1和dict2中的匹配鍵,在dict1中相應地更新相關月份和年份的總數。 如果 dict2 的鍵不在 dict1 中,那么我需要添加它然后再次求和。
所以 output 應該是;
{ 'y2019': { 'M09': { 'Day 20': { 'lane_1': Decimal('833'),
'lane_2': Decimal('1041'),
'lane_3': Decimal('4702'),
'lane_4': Decimal('5038'),
'total': Decimal('11614')},
'Day 12': { 'lane_1': Decimal('686'),
'lane_2': Decimal('831'),
'lane_3': Decimal('4184'),
'lane_4': Decimal('4157'),
'total': Decimal('9858')},
'lane_1': Decimal('1519 + ')},'),
'lane_2': Decimal('1872 + 831'),
'lane_3': Decimal('8886 + 4184'),
'lane_4': Decimal('9195 + 4157'),
'total': Decimal('21472 + 9858')},
'M10': { 'Day 01': { 'lane_1': Decimal('530'),
'lane_2': Decimal('632'),
'lane_3': Decimal('3964'),
'lane_4': Decimal('3756'),
'total': Decimal('8882')},
'Day 12': { 'lane_1': Decimal('355'),
'lane_2': Decimal('331'),
'lane_3': Decimal('3062'),
'lane_4': Decimal('3066'),
'total': Decimal('6814')},
'Day 16': { 'lane_1': Decimal('551'),
'lane_2': Decimal('638'),
'lane_3': Decimal('3770'),
'lane_4': Decimal('3738'),
'total': Decimal('8697')},
'lane_1': Decimal('1436'),
'lane_2': Decimal('1601'),
'lane_3': Decimal('10796'),
'lane_4': Decimal('10560'),
'total': Decimal('24393')},
'M11': { 'Day 03': { 'lane_1': Decimal('524'),
'lane_2': Decimal('599'),
'lane_3': Decimal('3370'),
'lane_4': Decimal('3247'),
'total': Decimal('7740')},
'lane_1': Decimal('524'),
'lane_2': Decimal('599'),
'lane_3': Decimal('3370'),
'lane_4': Decimal('3247'),
'total': Decimal('7740')},
'lane_1': Decimal('5870 + 686'),
'lane_2': Decimal('5992 + 831'),
'lane_3': Decimal('36947 + 4184'),
'lane_4': Decimal('35423 + 4157'),
'total': Decimal('84232 + 9858')}}
到目前為止,這是我嘗試過的;
def merge(d, new_d):
for k, v in new_d.items():
if isinstance(v, dict):
merge(d[k], v)
else:
d[k] = d.setdefault(k, 0) + v
merge(dict1, dict2)
但我得到一個 KeyError: 'Day 12'
我嘗試使用 try and catch 語句添加密鑰,但無法從中得出總和。 任何幫助表示贊賞。 :)
這是我解決它的方法;
def merge(original_dict, new_dict):
"""
Sum values of two nested dicts
"""
for key, value in new_dict.items():
if isinstance(value, dict):
try:
merge(original_dict[key], value)
except KeyError:
original_dict[key] = {}
merge(original_dict[key], value)
else:
original_dict[key] = original_dict.setdefault(key, 0) + value
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.