寻找一个嵌套的整数列表的总和

4
import math
lists =  [1,[2,3],4]
total = 0
for i in range(len(lists)):
    total += sum(i)
print(total)

我希望你能将其打印出来。
>>>10

但会抛出错误。

我希望它能够将所有数字相加,包括嵌套if语句中的数字。


所以,你只是想要 23 的和吗? - user1786283
1
它应该打印什么? - Blender
1
尝试使用reduce函数:http://docs.python.org/release/1.4/tut/node83.html - Arnaldo Ignacio Gaspar Véjar
在添加值之前,您需要将列表展平。遍历列表并删除任何子列表,将它们的值附加到主列表中。 - intrepidis
这个回答解决了你的问题吗?Python中嵌套列表的总和 - Georgy
这是8年前@Georgy... - Jack
3个回答

7

在你的程序中,for i in range(len(lists)) - 计算结果为3,因为 lists 对象有3个元素。在循环体中,total += sum(i) 会尝试进行一个 int + list 的操作,这将导致错误。因此,你需要检查类型,然后加上各个元素。

def list_sum(L):
    total = 0  
    for i in L:
        if isinstance(i, list): 
            total += list_sum(i)
        else:
            total += i
    return total

这是@pavelanossov的评论-以更优雅的方式执行相同的操作。
sum(sum(i) if isinstance(i, list) else i for i in L)

1
sum(sum(i) if isinstance(i, list) else i for i in L) - Pavel Anossov
这告诉我nested_sum未定义,很抱歉可能有些遗漏,但nested sum应该是什么?谢谢。 - Jack
抱歉,打错了。刚刚修正了。 - karthikr
对我而言,sum(sum(i) if isinstance(i, list) else i for i in L) 只适用于至多两层嵌套的列表。这个列表失败了:L = ([[1, 1, 1], [1, [1, 1]], 1])。虽然不够优雅,但是 @karthikr 上面的函数 list_sum(L) 对于任意层级的列表都可以工作,因为它使用了递归。 - ColoradoGranite

6
您可以在编译器.ast模块中使用flatten函数来展开列表。然后简单地将所有元素相加即可。
>>> lists =  [1,[2,3],4]
>>> from compiler.ast import flatten
>>> sum(flatten(lists))
10

编辑: 仅支持Python 2.x版本


这让我产生了一个错误,说找不到模块命名为“compiler”,怎么回事? - Jack
实际上,我现在已经查看了文档,编译器模块在Python 3中已被删除。我之前一直在使用Python 2.7。 - Faruk Sahin
它已被类似的东西所取代了吗? - Jack

0

numpy.hstack() 函数用于将输入数组序列水平堆叠(即按列方向),以生成单个数组,这正是 OP 示例所需的。

import numpy as np 

list1 =  [1,[2,3],4]
M = np.hstack(list1) 
print(np.sum(M))

提供

10

[Program finished]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接