求和一个整数嵌套列表的嵌套列表



给定一个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检查是不必要的

最新更新