映射嵌套字典并在 python 中更新它?
Mapping nested dictionary and upate it in python?
我有嵌套字典,想像这样对它求和:
{
"USA":{
'008612':{
'January':{
'target':345,
'achieved':0
},
'Febuary':{
'target':305,
'achieved':0
},
'March':{
'target':345,
'achieved':0
},
},
'001232':{
'January':{
'target':245,
'achieved':0
},
'Febuary':{
'target':205,
'achieved':0
},
'March':{
'target':105,
'achieved':0
},
}
},
"UK":{
'008612':{
'January':{
'target':645,
'achieved':0
},
'Febuary':{
'target':505,
'achieved':0
},
'March':{
'target':445,
'achieved':0
},
},
'001232':{
'January':{
'target':745,
'achieved':0
},
'Febuary':{
'target':605,
'achieved':0
},
'March':{
'target':405,
'achieved':0
},
}
}
}
需要这种类型的字典,总字典包含相同项目代码{008612}和相同月份的目标和实现的总和。例如,新添加的Total词典中应添加相同月份的相同项目代码:
{
"Total":{
'008612':{
'January':{
'target':990=345+645,
'achieved':0=0+0
},
'Febuary':{
'target':810,
'achieved':0
},
'March':{
'target':790,
'achieved':0
},
},
'001232':{
'January':{
'target':890,
'achieved':0
},
'Febuary':{
'target':810,
'achieved':0
},
'March':{
'target':510,
'achieved':0
},
},
"USA":{
'008612':{
'January':{
'target':345,
'achieved':0
},
'Febuary':{
'target':305,
'achieved':0
},
'March':{
'target':345,
'achieved':0
},
},
'001232':{
'January':{
'target':245,
'achieved':0
},
'Febuary':{
'target':205,
'achieved':0
},
'March':{
'target':105,
'achieved':0
},
}
},
"UK":{
'008612':{
'January':{
'target':645,
'achieved':0
},
'Febuary':{
'target':505,
'achieved':0
},
'March':{
'target':445,
'achieved':0
},
},
'001232':{
'January':{
'target':745,
'achieved':0
},
'Febuary':{
'target':605,
'achieved':0
},
'March':{
'target':405,
'achieved':0
},
}
}
}
提前致谢!
您将不得不多次遍历字典及其值,并计算一个单独的字典来存储计算出的值。
已经写了示例代码供大家参考:
total = {}
for k, v in data.items(): # data is the original data dict
for ik, iv in v.items():
temp = total.get(ik, {})
if not temp:
total[ik] = iv
else:
for tk, tv in temp.items():
for itk, itv in tv.items():
temp[tk][itk] += iv[tk][itk]
计算完上面的 total 字典后,您就可以将其添加到原始数据中。
希望这能回答您的问题。干杯!
我有嵌套字典,想像这样对它求和:
{
"USA":{
'008612':{
'January':{
'target':345,
'achieved':0
},
'Febuary':{
'target':305,
'achieved':0
},
'March':{
'target':345,
'achieved':0
},
},
'001232':{
'January':{
'target':245,
'achieved':0
},
'Febuary':{
'target':205,
'achieved':0
},
'March':{
'target':105,
'achieved':0
},
}
},
"UK":{
'008612':{
'January':{
'target':645,
'achieved':0
},
'Febuary':{
'target':505,
'achieved':0
},
'March':{
'target':445,
'achieved':0
},
},
'001232':{
'January':{
'target':745,
'achieved':0
},
'Febuary':{
'target':605,
'achieved':0
},
'March':{
'target':405,
'achieved':0
},
}
}
}
需要这种类型的字典,总字典包含相同项目代码{008612}和相同月份的目标和实现的总和。例如,新添加的Total词典中应添加相同月份的相同项目代码:
{
"Total":{
'008612':{
'January':{
'target':990=345+645,
'achieved':0=0+0
},
'Febuary':{
'target':810,
'achieved':0
},
'March':{
'target':790,
'achieved':0
},
},
'001232':{
'January':{
'target':890,
'achieved':0
},
'Febuary':{
'target':810,
'achieved':0
},
'March':{
'target':510,
'achieved':0
},
},
"USA":{
'008612':{
'January':{
'target':345,
'achieved':0
},
'Febuary':{
'target':305,
'achieved':0
},
'March':{
'target':345,
'achieved':0
},
},
'001232':{
'January':{
'target':245,
'achieved':0
},
'Febuary':{
'target':205,
'achieved':0
},
'March':{
'target':105,
'achieved':0
},
}
},
"UK":{
'008612':{
'January':{
'target':645,
'achieved':0
},
'Febuary':{
'target':505,
'achieved':0
},
'March':{
'target':445,
'achieved':0
},
},
'001232':{
'January':{
'target':745,
'achieved':0
},
'Febuary':{
'target':605,
'achieved':0
},
'March':{
'target':405,
'achieved':0
},
}
}
}
提前致谢!
您将不得不多次遍历字典及其值,并计算一个单独的字典来存储计算出的值。 已经写了示例代码供大家参考:
total = {}
for k, v in data.items(): # data is the original data dict
for ik, iv in v.items():
temp = total.get(ik, {})
if not temp:
total[ik] = iv
else:
for tk, tv in temp.items():
for itk, itv in tv.items():
temp[tk][itk] += iv[tk][itk]
计算完上面的 total 字典后,您就可以将其添加到原始数据中。 希望这能回答您的问题。干杯!