计算嵌套列表的深度或最深级别

新手上路,请多包涵

A 对作业有真正的问题(和头痛)……

我在入门编程课上,我必须编写一个函数,给定一个列表,将返回它到达的“最大”深度……例如:[1,2,3] 将返回 1,[ 1,[2,3]] 将返回 2…

我已经写了这段代码(这是我能得到的最好的 T_T)

 def flat(l):
    count=0
    for item in l:
        if isinstance(item,list):
            count+= flat(item)
    return count+1

然而,它显然不能像它应该的那样工作,因为如果有不计入最大深度的列表,它仍然会增加计数器……

例如:当我将函数与 [1,2,[3,4],5,[6],7] 一起使用时,它应该返回 2,但它返回 3…

任何想法或帮助将不胜感激^^非常感谢!我已经为此苦苦挣扎了几个星期了……

原文由 dhcarmona 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 820
2 个回答

广度优先,没有递归,它也适用于其他序列类型:

 from collections import Sequence
from itertools import chain, count

def depth(seq):
    for level in count():
        if not seq:
            return level
        seq = list(chain.from_iterable(s for s in seq if isinstance(s, Sequence)))

同样的想法,但内存消耗少得多:

 from collections import Sequence
from itertools import chain, count

def depth(seq):
    seq = iter(seq)
    try:
        for level in count():
            seq = chain([next(seq)], seq)
            seq = chain.from_iterable(s for s in seq if isinstance(s, Sequence))
    except StopIteration:
        return level

原文由 pillmuncher 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是编写函数的一种方法

depth = lambda L: isinstance(L, list) and max(map(depth, L))+1

我认为你缺少的想法是使用 max()

原文由 John La Rooy 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题