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
相关产品推荐
相关产品推荐

