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

Python嵌套结构数字求和函数的优雅实现方案咨询

嵌套结构数值求和的优化实现

你的代码能正确完成需求,但遍历过程中动态修改原列表的做法,不仅可读性欠佳,在数据量较大时也会影响效率。下面提供两种更优雅的实现方案:

一、不导入模块的实现

1. 递归实现(最直观)

递归是处理嵌套层级结构的经典方式,逻辑清晰易懂:

def sum_all(*args):
    total = 0
    for elem in args:
        # 如果是列表/元组,递归展开求和
        if isinstance(elem, (list, tuple)):
            total += sum_all(*elem)
        # 如果是数值类型,直接累加
        elif isinstance(elem, (int, float)):
            total += elem
    return total

2. 迭代栈实现(避免递归深度限制)

如果遇到极端深层嵌套的情况,递归可能触发RecursionError,用栈模拟递归的方式更稳妥:

def sum_all(*args):
    total = 0
    stack = list(args)
    while stack:
        elem = stack.pop()
        if isinstance(elem, (list, tuple)):
            stack.extend(elem)
        elif isinstance(elem, (int, float)):
            total += elem
    return total

这个版本通过栈来遍历所有元素,不会修改原输入结构,效率也更高。

二、导入模块的实现(通用型更强)

利用标准库的collections.abc.Iterable判断可迭代对象,除了列表、元组,还能支持其他可迭代类型(同时排除字符串,避免误处理):

from collections.abc import Iterable

def sum_all(*args):
    total = 0
    for elem in args:
        # 判断是可迭代对象且不是字符串/字节串
        if isinstance(elem, Iterable) and not isinstance(elem, (str, bytes)):
            total += sum_all(*elem)
        elif isinstance(elem, (int, float)):
            total += elem
    return total

这个版本的通用性更好,能处理更多类型的嵌套可迭代结构。

测试验证

用你的测试用例验证,结果完全符合预期:

test1 = [1, 3, 5, 7, 9]
test2 = [1, 2, [3, 4], 5, 6, 7, [8, 9]]
test3 = [[1, 2, "string", {"error": 404}, [3, [4, 5]]], 6, 7, [8, [9, [10, 11]]], (12, 13, 14)]

print(sum_all(test1))  # 输出 25
print(sum_all(test2))  # 输出 45
print(sum_all(test3))  # 输出 105

内容的提问来源于stack exchange,提问作者The Lonesome Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:14:55