dic={"a":1,
"b":5,
"c":{"a":3,"c":-5,"d":{"a":1,"b":3}}}
,输出
{"a":5,"b":8,"c":-5,"d":0}
我正面临更新字典秒for循环
d=dict()
d2=dict()
for i in dic:
c_dict=dic[i]
if type(dic[i])!=dict: #a:1 ,b:5
d[i] = dic[i]
else:
for j in c_dict:
value=c_dict[j]
if type(value)!=dict:
d2[j]=value
d2[j]=value对于这个,我必须更新a和b的先前值
这里的问题是d键是否应该在结果字典中。如果要忽略它,则:
dic = {"a": 1,
"b": 5,
"c": {"a": 3, "c": -5, "d": {"a": 1, "b": 3}}}
result = {}
def process(d):
for k, v in d.items():
if isinstance(v, dict):
process(v)
else:
result[k] = result.get(k, 0) + v
process(dic)
print(result)
输出:
{'a': 5, 'b': 8, 'c': -5}
注意:
这里的假设是所有值要么是字典类型,要么是数字类型
-
由于您需要对字典的多个级别实现相同的功能,因此您需要递归方法来处理字典:
- 如果值为int,则添加
- 如果值为dict,则调用该值的方法
-
当你想对每个值做加法时,你需要确保在加法之前有一个值,你可以用
defaultdict(int)
来解决这个问题,这将确保你问的每个键都是零,所以你可以直接做+=
from collections import defaultdict
def add_to_dict(base, more_values):
for k, val in more_values.items():
base[k] += 0 # for keys like 'd'
if isinstance(val, dict):
add_to_dict(base, val)
else:
base[k] += val
data = {"a": 1, "b": 5,
"c": {"a": 3, "c": -5, "d": {"a": 1, "b": 3}}}
result = defaultdict(int)
add_to_dict(result, data)
print(result) # {"a": 5, "b": 8, "c": -5, "d": 0}