给定一个Python列表,其元素是整数或整数列表(只是我们不知道嵌套有多深),我们怎样才能找到列表中每个单独整数的总和?
找到一个嵌套只有一层深度的列表总和是相当简单的,例如。
[1, [1, 2, 3]]
# sum is 7
但是如果嵌套深度为两级,三级或更多级会怎么样?
[1, [1, [2, 3]]]
# two levels deep
[1, [1, [2, [3]]]]
# three levels deep
上述每种情况的总和是相同的(即7)。我认为最好的方法是使用递归,其中基本情况是一个带有单个整数元素的列表,但除此之外,我被卡住了。
答案 0 :(得分: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
答案 1 :(得分:5)
我能想到的最简单方法:
from compiler.ast import flatten
sum(flatten(numbs))
答案 2 :(得分:3)
假设您只使用列表,这应该可以解决问题:
def sum_nested(l):
s = 0
for item in l:
if type(item) is list:
s += sum_nested(item)
else:
s += item
return s
答案 3 :(得分:2)
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指出使用basestring
时,无需sum()
检查。