Python-查找嵌套列表的总和

Python-查找嵌套列表的总和,python,recursion,Python,Recursion,这个递归嵌套列表有问题。我现在遇到的问题是,如果列表不在列表的末尾,代码工作正常。。。我不知道该怎么做才能解决这个问题 def rsum(l): # Sum of all num in the list print l if isinstance(l[0], list): if len(l[0]) == 0: result = 0 + rsum(l[1:]) else: sum_in_li

这个递归嵌套列表有问题。我现在遇到的问题是,如果列表不在列表的末尾,代码工作正常。。。我不知道该怎么做才能解决这个问题

def rsum(l):
    # Sum of all num in the list
    print l
    if isinstance(l[0], list):

        if len(l[0]) == 0:
            result = 0 + rsum(l[1:])

        else:
            sum_in_list = rsum(l[0])
            result = sum_in_list + rsum(l[1:])

    elif len(l) == 1:
        result = l[0]

    else:
        result = l[0] + rsum(l[1:])

    return result
所以它可以像这样工作

l = [1, 2, [], 3, [2, 100], 4, [5], [], 2]
print rsum(l)
119
但如果我这样做

l = [1, 2, [], 3, [2, 100], 4, [5], [], [2]]
IndexError: list index out of range

任何帮助或建议都可以为我指明正确的方向

如果您向其传递一个空列表,它将尝试访问
l[0]
,并导致错误。但这里有一个更简单的解决方案:

def rsum(l):
    if isinstance(l, list):
        return sum(rsum(v) for v in l)
    else:
        return l
这应该适用于所有情况

如果您想要一个真正简洁的版本,可以使用:

def rsum(l):
    return sum(map(rsum, l)) if isinstance(l, list) else l

如果您向它传递一个空列表,它将尝试访问
l[0]
,并导致错误。但这里有一个更简单的解决方案:

def rsum(l):
    if isinstance(l, list):
        return sum(rsum(v) for v in l)
    else:
        return l
这应该适用于所有情况

如果您想要一个真正简洁的版本,可以使用:

def rsum(l):
    return sum(map(rsum, l)) if isinstance(l, list) else l

如果在
l
中没有项目的情况下调用
l[0]
,将引发
索引器

像这样抓住它-

else:
    try:
        result = l[0] + rsum(l[1:])
    except IndexError:
        result = 0
或者检查
l

else:
    if len(l) > 0: 
        result = l[0] + rsum(l[1:])
    else: 
        result = 0

如果在
l
中没有项目的情况下调用
l[0]
,将引发
索引器

像这样抓住它-

else:
    try:
        result = l[0] + rsum(l[1:])
    except IndexError:
        result = 0
或者检查
l

else:
    if len(l) > 0: 
        result = l[0] + rsum(l[1:])
    else: 
        result = 0
另一个版本:

>>> flatten = lambda *n: (e for a in n
...     for e in (flatten(*a) if isinstance(a, (tuple, list)) else (a,)))
>>> l = [1, 2, [], 3, [2, 100], 4, [5], [], 2]
>>> sum(flatten(l))
119
在Python 3中,您可以递归地使用
yield from
来展平任意列表:

def flatten(L):
    for item in L:
        try:
            yield from flatten(item)
        except TypeError:
            yield item

>>> l = [1, 2, [], 3, [2, 100], 4, [5], [], 2]
>>> sum(flatten(l))
119
另一个版本:

>>> flatten = lambda *n: (e for a in n
...     for e in (flatten(*a) if isinstance(a, (tuple, list)) else (a,)))
>>> l = [1, 2, [], 3, [2, 100], 4, [5], [], 2]
>>> sum(flatten(l))
119
在Python 3中,您可以递归地使用
yield from
来展平任意列表:

def flatten(L):
    for item in L:
        try:
            yield from flatten(item)
        except TypeError:
            yield item

>>> l = [1, 2, [], 3, [2, 100], 4, [5], [], 2]
>>> sum(flatten(l))
119
再来一次

def rsum(L):
    return sum([rsum(i) for i in L]) if isinstance(L, list) else L
再来一次

def rsum(L):
    return sum([rsum(i) for i in L]) if isinstance(L, list) else L

也许更好的设计是首先检查
l
本身是否是一个列表,而不是它的第一项是否是一个列表,然后如果它是(即计算其部分之和),或者如果它是一个整数,则只返回其值。也许更好的设计是首先检查
l
本身是否是一个列表,而不是如果它的第一项是一个列表,然后如果它是(即计算它的部分之和)就对它进行操作,或者如果它是一个整数就返回它的值。