Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求整数嵌套列表的嵌套列表的和_Python_List - Fatal编程技术网

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)。我认为最好的方法是使用递归,其中基本情况是一个包含

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

查找嵌套深度仅为一级的列表的总和非常简单,例如

[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]]]]))