给定一个Python列表,其元素是整数或整数列表(只是我们不知道嵌套有多深),我们怎样才能找到列表中每个单独整数的总和?
找到一个嵌套只有一层深度的列表总和是相当简单的, 但是如果嵌套深入两层,三层或更深层怎么办?
我知道最好的方法是递归,但这是一个挑战,我必须在没有递归的情况下进行。
请帮助!!
答案 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,则扩展到输入列表的末尾