Python如何实现两个不同嵌套字典对应指定字段值的减法运算?
Python嵌套字典指定字段差值计算实现
你当前的需求本质是单层字典键值匹配逻辑的延伸,只需要沿着固定的嵌套路径定位到目标quant字段做运算即可,不需要复杂逻辑。
方案1:适配当前固定结构的轻量实现
如果你的字典结构固定为「外层index键 → output字典 → 单元素列表 → 存quant等字段的字典」,直接用下面的代码即可,逻辑和你写的单层字典遍历完全对齐:
import copy output = {} for index_key, val1 in dict1.items(): # 深拷贝当前节点的完整结构,保证var1、var2、list1等非目标字段原样保留 output[index_key] = copy.deepcopy(val1) # 定位到两个字典对应位置的quant值做差,加容错避免缺key报错 q1 = val1["output"][0]["quant"] q2 = dict2.get(index_key, {}).get("output", [{}])[0].get("quant", 0) # 写入计算后的差值 output[index_key]["output"][0]["quant"] = q2 - q1
注意必须用
copy.deepcopy做复制:字典、列表是Python可变对象,直接赋值会关联原字典的内存地址,修改结果时会改动原始dict1的数据。
方案2:适配任意嵌套层级的通用递归实现
如果后续字典的嵌套层级、结构可能发生变化,quant字段可能出现在任意嵌套位置,可以用递归写法自动遍历所有层级做计算,其他字段自动保留:
import copy def quant_subtract(d_base, d_cal): # 非字典类型直接返回计算源的值(覆盖数字、字符串、列表等基础/容器类型) if not isinstance(d_base, dict) or not isinstance(d_cal, dict): return copy.deepcopy(d_cal) res = copy.deepcopy(d_base) for k, v in d_base.items(): if k == "quant": # 命中目标字段直接做差 res[k] = d_cal.get(k, 0) - v elif isinstance(v, list): # 遇到列表就遍历每个下标对应元素递归处理 cal_list = d_cal.get(k, []) res[k] = [ quant_subtract(v[i], cal_list[i]) for i in range(len(v)) if i < len(cal_list) ] elif isinstance(v, dict): # 遇到子字典就递归往下层遍历 res[k] = quant_subtract(v, d_cal.get(k, {})) return res # 直接调用即可得到结果 output = quant_subtract(dict1, dict2)
拿你提供的样例数据测试,两个方案输出的结果完全符合预期:index1对应quant差值为19000.0,index2对应quant差值为10000.0,其余字段和原结构完全一致,如果需要整数结果直接套int()转换即可。
内容的提问来源于stack exchange,提问作者harry
相关产品推荐
相关产品推荐

