Python 求整数嵌套列表的嵌套列表的和
给定一个Python列表,其元素要么是整数,要么是整数列表(只是我们不知道嵌套的深度),我们如何找到列表中每个整数的总和 查找嵌套深度仅为一级的列表的总和非常简单,例如Python 求整数嵌套列表的嵌套列表的和,python,list,Python,List,给定一个Python列表,其元素要么是整数,要么是整数列表(只是我们不知道嵌套的深度),我们如何找到列表中每个整数的总和 查找嵌套深度仅为一级的列表的总和非常简单,例如 [1, [1, 2, 3]] # sum is 7 但是如果筑巢深度达到两层、三层或更深层呢 [1, [1, [2, 3]]] # two levels deep [1, [1, [2, [3]]]] # three levels deep 上述每种情况的总和相同(即7)。我认为最好的方法是使用递归,其中基本情况是一个包含
[1, [1, 2, 3]]
# sum is 7
但是如果筑巢深度达到两层、三层或更深层呢
[1, [1, [2, 3]]]
# two levels deep
[1, [1, [2, [3]]]]
# three levels deep
上述每种情况的总和相同(即7)。我认为最好的方法是使用递归,其中基本情况是一个包含单个整数元素的列表,但除此之外,我陷入了困境。假设您只使用列表,这应该可以做到:
def sum_nested(l):
s = 0
for item in l:
if type(item) is list:
s += sum_nested(item)
else:
s += item
return s
我能想到的最简单的方法是:
from compiler.ast import flatten
sum(flatten(numbs))
您可以使用此递归解决方案:
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
一种方法:列出,然后使用
如果您只处理列表,请将isinstance(i,Iterable)
更改为isinstance(i,list)
,以大幅提高性能
请注意,使用Ashwini指出的
sum()
时,不需要进行basestring
检查。无需处理basestring
,因为如果列表包含字符串,那么sum
也会引发错误。@AshwiniChaudhary Cool。我想我需要注意一下。不过,我将把它留在这里,因为否则我们的答案是完全相同的。奇怪的是,itertools
+1中没有这样的东西,看起来这是首选的解决方案。我的答案将适用于Python 2.7.4,但看起来compilers.ast似乎已被弃用。这一个很好,因为它避免了在使用flatten
(以任何建议的形式)时发生的不必要的分配。但是,在类型测试中,我会将==
更改为is
。但是,在现实世界中,如果展平
生成一个iterable,则和(展平(x))
可能会更有效。建议对所有对象比较使用isinstance(项,列表)。“对象类型比较应始终使用isinstance(),而不是直接比较类型。”否则答案不错。@android我的答案中的flatten
实现(以及Ashwini的)不应该分配任何不必要的内容,只需为生成器对象分配一小段时间(在我的系统上,这只有80字节)@然而,Brien,我用[1,1,2,3]]]
(默认运行次数)通过timeit运行了您的解决方案,以及我和Ashwini的。。。你的:2.86801508880615
;矿山:16.686115026474
;阿什维尼的:14.88997197151184
。天鹰船长的也很不错,因为他被弃用了:5.101460933685303
。您使用的是isinstance
而不是3.312623977661133
。你得到我的支持。啊,我们的解决方案如此缓慢的原因是我们使用了isinstance(item,Iterable)
。当我将其更改为isinstance(项目,列表)
时,我得到3.9191691875457764
。唯一的假设是一个很好的优化。@CaptainSkyhawk这里的flatte
是什么?好吧,没有名为flatte
的内置函数。是的,我刚刚读到了。我投了你的一票,相信这是所有版本的正确解决方案。
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]]]]))