Python递归函数计算列表深度返回异常结果求助
排查递归计算深度函数的异常问题
让我帮你分析一下这个递归函数返回结果不符合预期的原因,以及如何修复它~
问题根源
你的get_depth函数目前的逻辑犯了两个关键错误:
- 只处理了可迭代对象的第一个元素:代码里只递归调用了
a[0],如果对象里不同元素的嵌套深度不一样,会直接忽略其他元素的深度。 - 错误地累加层级数值:当前返回的是
n + 递归结果,这会把每一层的层级数加起来,而不是取嵌套的最大深度。
举个例子,测试用例b = [[1,2], [2,3]]的执行路径:
get_depth(b, 0) → 0 + get_depth([1,2], 1) get_depth([1,2], 1) →1 + get_depth(1, 2) get_depth(1,2) → 返回2 最终总和:0+1+2=3,而实际我们需要的是最大嵌套层数2
修复方案
我们需要调整递归逻辑:遍历可迭代对象的所有元素,计算每个元素的深度,取其中的最大值,再加上当前层级的深度(+1)。
修正后的代码
def isiterable(obj): ''' takes in an obj and returns 1 if iterable or 0 if not strings are discarded as iterable :param obj: any object :return: int ''' if isinstance(obj, str): return 0 else: try: iter(obj) return 1 except TypeError as err: return 0 def get_depth(a, n=0): if isiterable(a): # 遍历所有元素,计算每个元素的深度,取最大值后加1(当前层级) return 1 + max(get_depth(item, n) for item in a) else: return n
测试验证
- 对于
a = [[[1,2], [3,4]], [[5,6],[7,8]]],返回3,符合预期 - 对于
b = [[1,2], [2,3]],返回2,符合预期 - 对于
c = [2],返回1,符合预期
补充优化
如果你希望初始调用时更简洁(不需要传递n参数),可以调整默认参数逻辑,让函数更符合直觉:
def get_depth(a): if isiterable(a): return 1 + max(get_depth(item) for item in a) else: return 0
这样调用get_depth([[[1,2]]])会直接返回3,使用起来更顺手。
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

