对嵌套的整数列表的嵌套列表求和

时间:2013-07-01 18:19:54

标签: python list

给定一个Python列表,其元素是整数或整数列表(只是我们不知道嵌套有多深),我们怎样才能找到列表中每个单独整数的总和?

找到一个嵌套只有一层深度的列表总和是相当简单的,例如。

[1, [1, 2, 3]]
# sum is 7

但是如果嵌套深度为两级,三级或更多级会怎么样?

[1, [1, [2, 3]]]
# two levels deep

[1, [1, [2, [3]]]]
# three levels deep

上述每种情况的总和是相同的(即7)。我认为最好的方法是使用递归,其中基本情况是一个带有单个整数元素的列表,但除此之外,我被卡住了。

4 个答案:

答案 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)

一种方法:flatten列表,然后使用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指出使用basestring时,无需sum()检查。