You need to enable JavaScript to run this app. Python递归计算嵌套JSON内sale字段求和始终返回0的问题排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.12 11:45:04