假设有一个Python列表,其中的元素要么是整数,要么是整数列表(我们不知道嵌套深度),如何找出列表中每个整数的总和?
如果列表只有一层嵌套,找到列表总和相对简单。但是如果嵌套有两层、三层或更多层呢?
我知道最好的方法是使用递归,但这是一项挑战,我必须在没有递归的情况下完成它。
请帮帮我!!
假设有一个Python列表,其中的元素要么是整数,要么是整数列表(我们不知道嵌套深度),如何找出列表中每个整数的总和?
如果列表只有一层嵌套,找到列表总和相对简单。但是如果嵌套有两层、三层或更多层呢?
我知道最好的方法是使用递归,但这是一项挑战,我必须在没有递归的情况下完成它。
请帮帮我!!
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)
一种大部分易读(并且可能高效,虽然我没有测试过)的逐步展开列表的方法:
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
list.pop(0)
的恶劣O(n**2)行为。您可以通过创建反向副本并从末尾弹出来获得等效的结果,但如果只是使用双端队列和popleft
,我觉得代码更容易理解一些。同样,如果要原地突变列表,则可以节省一两行代码,但速度要慢得多(由于相同的原因;从列表的头弹出是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
把它展成平面后,求和就变得非常简单了 :-)
这里有一个解决方案:
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