如何使用递归来计算嵌套列表的最大长度?

时间:2016-03-02 20:05:10

标签: python list python-3.x recursion maxlength

以下是计算嵌套列表中最大长度的代码。

def max_length(obj):
    """
    Return the maximum length of obj or any of its sublists, if obj is a list.
    otherwise return 0.

    @param object|list obj: object to return length of
    @rtype: int

    >>> max_length(17)
    0
    >>> max_length([1, 2, 3, 17])
    4
    >>> max_length([[1, 2, 3, 3], 4, [4, 5]])
    4
    """
    if isinstance(obj,int):
        return 0
    else:
        return max([len(x) for x in obj])

代码错误,因为我不知道如何正确组合len()函数和递归。我该怎么办?

4 个答案:

答案 0 :(得分:1)

这是怎么回事?

def nested_list(l):
    if type(l) is not list:
        return 0

    lens = [len(l)]

    for x in l:
        lens.append(nested_list(x))
    return max(lens)

...如果你想要更多的Pythonic和鸭子类型......

def nested_list(l):
    try:
        lens = [len(l)]
    except TypeError:
        return 0

    for x in l:
        lens.append(nested_list(x))
    return max(lens)

答案 1 :(得分:1)

你根本就没有在这里使用递归。递归invovles在同一个方法中调用方法。一种方法可以如下。请注意,这里有三种情况,

  1. obj只是int时,您需要返回0
  2. objlistint时,您需要返回len
  3. list gth
  4. obj是异构list时,您需要递归
  5. 代码示例可以是

    >>> def max_length(obj):
    ...     if isinstance(obj,int):
    ...         return 0
    ...     elif all(isinstance(i,int) for i in obj):
    ...             return len(obj)
    ...     else:
    ...         return max(max_length(i) for i in obj)
    ... 
    >>> max_length(17)
    0
    >>> max_length([1, 2, 3, 17])
    4
    >>> max_length([[1, 2, 3, 3], 4, [4, 5]])
    4
    

答案 2 :(得分:0)

这是您最接近您的代码:

def max_length(obj): if isinstance(obj,int): return 0 else: return max(len(obj), max([max_length(i) for i in obj]))

答案 3 :(得分:0)

result = []
if isinstance(obj, int):
    result.append(0)
else:
    for sublist in obj:
        result.append(max_length(sublist))
        result.append(len(obj))
return max(result)

这将完美地工作。上面的某些代码没有给出正确的答案。