Python递归计算嵌套JSON内sale字段求和始终返回0的问题排查
代码问题定位
第一版递归实现的问题
- 递归结果完全丢失:每次调用
sale_sum时,函数内部的sale_list是局部变量,子递归调用中append的sale值、计算的总和,没有任何代码把这些值返回到外层作用域。所有内层递归计算完直接退出,外层的sale_list始终为空,最终求和结果就是0。 - 遍历逻辑覆盖不全:原代码只处理了dict下的list值,没有直接遍历传入函数的顶级list结构,遇到直接传list作为参数的场景会完全失效。
- 精度丢失:对浮点类型的sale值强制转int,会截断小数部分,和原始数值产生偏差。
- 你给出的示例JSON存在语法错误:数组
List1内部直接嵌入了键值对,不符合JSON格式规范,运行时会直接解析报错,合法的嵌套结构应当是:
{ "fields": { "List1": [ { "List2": [ { "List3": [ {"item": "1", "sale": 1149.99}, {"item": "2", "sale": 20} ] } ] } ] } }
第二版嵌套函数实现的问题
- 遗漏递归调用:定义了内部递归函数
list_count,但全程没有调用这个函数。代码执行时直接跳过递归逻辑,对空的sale_list做求和,结果自然是0。 - 同样存在无意义的int强转、列表遍历场景覆盖不全的问题。
正确实现方案
递归累加版(无外部依赖,逻辑清晰)
把每一层递归计算的总和直接向上传递,不依赖临时列表存值:
def sale_sum(json_data): total = 0 # 处理字典结构 if isinstance(json_data, dict): for key, value in json_data.items(): if key == "sale": total += value elif isinstance(value, (dict, list)): total += sale_sum(value) # 处理列表结构 elif isinstance(json_data, list): for item in json_data: total += sale_sum(item) return total
嵌套函数修正版
补上缺失的递归调用,去掉无意义的强转逻辑:
def sale_sum(json_data): sale_values = [] def traverse(nested): if isinstance(nested, dict): for key, value in nested.items(): if key == "sale": sale_values.append(value) elif isinstance(value, (dict, list)): traverse(value) elif isinstance(nested, list): for item in nested: traverse(item) # 启动递归遍历 traverse(json_data) return sum(sale_values)
更简洁的生成器实现
通过生成器逐个抛出匹配的sale值,不需要维护额外的临时列表,代码更轻量化:
def extract_sale(nested): if isinstance(nested, dict): for key, value in nested.items(): if key == "sale": yield value else: yield from extract_sale(value) elif isinstance(nested, list): for item in nested: yield from extract_sale(item) # 直接调用求和即可 total_sale = sum(extract_sale(your_nested_json))
内容的提问来源于stack exchange,提问作者kihhfeue
相关产品推荐
相关产品推荐

