在python中对没有递归的嵌套列表求和

时间:2014-05-07 02:27:02

标签: python recursion sum nested-lists

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

找到一个嵌套只有一层深度的列表总和是相当简单的, 但是如果嵌套深入两层,三层或更深层怎么办?

我知道最好的方法是递归,但这是一个挑战,我必须在没有递归的情况下进行。

请帮助!!

3 个答案:

答案 0 :(得分:3)

L = [...]
while any(isinstance(i, list) for i in L):
   L = [j for i in L for j in (i if isinstance(i, list) else [i])]

result = sum(L)

基本上你迭代外部列表并解压缩任何内部列表的第一级,直到没有内部列表为止

答案 1 :(得分:1)

一个大多数可读(并且可能是高性能的,虽然我还没有测试过它)以迭代方式展平列表的方式:

from collections import deque

def iterative_flatten(li):
    nested = deque(li)
    res = []
    dq = deque()
    while nested or dq:
        x = dq.pop() if dq else nested.popleft()
        dq.extend(reversed(x)) if isinstance(x, list) else res.append(x)
    return res

使用deques避免来自list.pop(0)的令人讨厌的O(n ** 2)行为。您可以通过制作反向复制并从最后弹出来获得相同的结果,但如果您只使用deques和popleft,我会发现代码更容易理解。在类似的说明中,如果你想要在适当的位置改变列表但速度较慢(相同的原因; pop来自 head 的ping,它会减少一两行代码列表的列表是O(n),因为基础数组中的每个元素都必须被移位。

nested = [1,[[2,3],[[4,5],[6]]],[[[[7]]]]]

iterative_flatten(nested)
Out[116]: [1, 2, 3, 4, 5, 6, 7]

sum(iterative_flatten(nested))
Out[117]: 28

在它平坦之后,总结(希望)是微不足道的: - )

答案 2 :(得分:0)

这是一个解决方案:

from copy import deepcopy

def recursive_sum(int_list):
    #int_list = deepcopy(int_list)    use this line if don't want to modify original list
    ret = 0
    while len(int_list) > 0:
        elem = int_list.pop(0)
        if type(elem) == int:
            ret += elem
        elif type(elem) == list:
            int_list.extend(elem)
        else:
            raise ValueError
    return ret

testcase = [1,2,3,[4,5,[6,7,8,[9,10]]]]
print recursive_sum(testcase)    # print 55

基本上,它会弹出输入列表的第一个元素。如果是Int,加入总和;如果它是List,则扩展到输入列表的末尾