我目前正在使用Python中的递归函数,但是遇到了麻烦。如标题所述,问题在于返回任意嵌套列表的最大深度。

这是我到目前为止的内容:

def depthCount(lst):
    'takes an arbitrarily nested list as a parameter and returns the maximum depth to which the list has nested sub-lists.'

    var = 0

    if len(lst) > 0:

        if type(lst[0]) == list:
            var += 1
            depthCount(lst[1:])

        else:
            depthCount(lst[1:])

    else:
        return var

我觉得问题出在我的递归调用上(这可能很明显)。当列表到达末尾时,它的确会返回var,但是当我有一个非空列表时,事情就出错了。什么也没有退还。

我切片错了吗?我应该在递归调用中的分片之前做些什么吗?

问题可能也与我的基本情况有关。

最佳答案

如果它们只是嵌套列表,例如[[[], []], [], [[]]],这是一个不错的解决方案:

def depthCount(lst):
    return 1 + max(map(depthCount, lst), default=0)

如果您不使用引入了default参数的Python 3.4,可以使用以下稍微的变化:
def depthCount(lst):
    return len(lst) and 1 + max(map(depthCount, lst))

它们的计数方式也不同。第一个将空列表视为深度1,第二个将深度列表视为0。不过,第一个易于调整,不过只需将默认值设为-1。

如果它们不只是嵌套列表(例如[[[1], 'a', [-5.5]], [(6,3)], [['hi']]])),则适用于以下内容:
def depthCount(x):
    return 1 + max(map(depthCount, x)) if x and isinstance(x, list) else 0

def depthCount(x):
    return int(isinstance(x, list)) and len(x) and 1 + max(map(depthCount, x))

确保您了解后者的工作原理。如果您还不了解它,它将教您and在Python中的工作方式:-)

接受“纯递归” 挑战:
def depthCount(x, depth=0):
    if not x or not isinstance(x, list):
        return depth
    return max(depthCount(x[0], depth+1),
               depthCount(x[1:], depth))

当然,额外的论点有点丑陋,但我认为可以。

10-08 05:38
查看更多