You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算多层嵌套字典中所有'tons'字段的总和?

统计多层嵌套字典中所有'tons'字段的总和

给定层级结构不固定的warehouses字典,需要提取所有tons字段的数值总和。原代码直接调用sum(warehouses.values())会抛出TypeError: unsupported operand type(s) for +: 'int' and 'list',因为字典的值包含列表、嵌套字典等非数值类型,sum无法直接处理。

解决方法:递归遍历嵌套结构

由于字典的层级不固定,使用递归方式遍历所有嵌套元素,提取tons值累加是最灵活的方案:

def calculate_total_tons(data):
    total = 0
    if isinstance(data, dict):
        # 检查当前字典是否包含'tons'字段
        if 'tons' in data:
            total += data['tons']
        # 递归处理字典的所有值
        for value in data.values():
            total += calculate_total_tons(value)
    elif isinstance(data, list):
        # 递归处理列表中的每个元素
        for item in data:
            total += calculate_total_tons(item)
    return total

# 测试代码
warehouses = { 
    "Warehouse Lisboa": [
        { "name": "apples", "tons": 4},
        { "name": "oranges", "tons": 10},
        { "name": "lemons", "tons": 50}
    ], 
    "Warehouse Cascais": { 
            "Branch 1": [
                { "name": "apples", "tons": 10},
                { "name": "oranges", "tons": 24}
            ],
            "Branch 2": [
                { "name": "apples", "tons": 16},
                { "name": "oranges", "tons": 8}
            ]
    }, 
    "Warehouse Oeiras": { 
            "Branch 1": { 
                "Sub Branch 1":{
                    "Sub sub Branch 1": [
                        { "name": "lemons", "tons": 10}       
                    ]
                } 
            },
            "Branch 2": [ 
                { "name": "apples", "tons": 3}    
            ]
    }
}

print(calculate_total_tons(warehouses))  # 输出:135

代码说明

  1. 递归逻辑:函数会逐层遍历所有嵌套的字典和列表:
    • 遇到字典时,先检查是否有tons键,有则累加对应数值;再递归处理字典的每个值
    • 遇到列表时,遍历列表中的每个元素,递归处理每个元素
    • 其他非容器类型(如字符串、数字)直接返回0,不影响总和
  2. 结果验证:所有tons值的总和为4+10+50+10+24+16+8+10+3=135,与代码输出一致。

内容的提问来源于stack exchange,提问作者Manuel Carvalhinha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:01:50