给定一个Python列表,其元素要么是整数,要么是整数列表(只是我们不知道嵌套有多深),我们如何找到列表中每个单个整数的总和?
很容易找到嵌套只深入一级的列表的总和,例如
[1, [1, 2, 3]]
# sum is 7
但是,如果嵌套深度达到两层、三层或更多层呢?
[1, [1, [2, 3]]]
# two levels deep
[1, [1, [2, [3]]]]
# three levels deep
上述每种情况下的总和都是相同的(即7)。我认为最好的方法是使用递归,其中基本情况是一个带有单个整数元素的列表,但除此之外,我就陷入了困境。
您可以使用以下递归解决方案:
from collections import Iterable
def flatten(collection):
for element in collection:
if isinstance(element, Iterable):
for x in flatten(element):
yield x
else:
yield element
演示:
>>> lis = [1, [1, [2, [3]]]]
>>> sum(flatten(lis))
7
>>> lis = [1, [1, 2, 3]]
>>> sum(flatten(lis))
7
>>> lis = [1, [1, [2, 3]]]
>>> sum(flatten(lis))
7
我能想到的最简单的方法:
from compiler.ast import flatten
sum(flatten(numbs))
假设您只使用列表,这应该可以做到:
def sum_nested(l):
s = 0
for item in l:
if type(item) is list:
s += sum_nested(item)
else:
s += item
return s
一种方法是:压平列表,然后使用sum()
。
from collections import Iterable
def flatten(lst):
for i in lst:
if isinstance(i, Iterable) and not isinstance(i, basestring):
for sublst in flatten(i):
yield sublst
else:
yield i
sum(flatten([1, [1, [2, [3]]]]))
如果您只处理列表,请将isinstance(i, Iterable)
更改为isinstance(i, list)
以大幅提高性能。
注意,正如Ashwini所指出的,当使用sum()
时,basestring
检查是不必要的