0

给定一个 Python 列表,其元素要么是整数,要么是整数列表(只是我们不知道嵌套的深度),我们如何找到列表中每个整数的总和?

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

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

但是,如果嵌套有两层、三层或更多层怎么办?

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

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

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

4

4 回答 4

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
于 2013-07-01T18:25:14.307 回答
5

我能想到的最简单的方法:

from compiler.ast import flatten
sum(flatten(numbs))
于 2013-07-01T18:24:49.157 回答
4

假设您只使用列表,这应该可以解决问题:

def sum_nested(l):
    s = 0
    for item in l:
        if type(item) is list:
            s += sum_nested(item)
        else:
            s += item
    return s
于 2013-07-01T18:24:07.680 回答
2

一种方法:展平列表,然后使用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()

于 2013-07-01T18:28:18.207 回答