我遇到了这个递归嵌套列表的问题。我现在遇到的问题是,如果列表不在列表的末尾,代码工作正常......我无法弄清楚我应该怎么做才能解决这个问题。
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
任何指导我指向正确方向的帮助或建议都会很棒
答案 0 :(得分:1)
如果您致电l[0]
l
中没有项目,IndexError
将会被提出。
像这样抓住它 -
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
答案 1 :(得分:1)
另一个版本:
>>> 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
答案 2 :(得分:0)
如果您将其传递给空列表,它将尝试访问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
答案 3 :(得分:0)
另一个拍摄
def rsum(L):
return sum([rsum(i) for i in L]) if isinstance(L, list) else L