Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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_Nested Lists - Fatal编程技术网

Python 将所有嵌套列表中的元素相加

Python 将所有嵌套列表中的元素相加,python,nested-lists,Python,Nested Lists,我将所有嵌套列表中的元素相加,到目前为止,我得到的是 for i in range(len(b)) : for j in range(len(b[i])): total = total + b[i][j] 但是当嵌套列表中存在一个整数值时,这将不起作用 b = [[1,2], [3,4], [5,6], 1] 在本例中,我收到一条错误消息,即“int”类型的对象没有len()。 在这种情况下,我应该怎么做?首先,您向Python程序员展示了一种常见的反模式,不要

我将所有嵌套列表中的元素相加,到目前为止,我得到的是

for i in range(len(b)) :
    for j in range(len(b[i])):
        total = total + b[i][j]

但是当嵌套列表中存在一个整数值时,这将不起作用

b = [[1,2], [3,4], [5,6], 1]

在本例中,我收到一条错误消息,即“int”类型的对象没有len()。
在这种情况下,我应该怎么做?

首先,您向Python程序员展示了一种常见的反模式,不要循环索引,而是循环对象本身。例如:

for item in b:
    do_something(item)
而不是:

for i in range(len(b)):
    do_something(b[i])
它更清晰、更简单、更快

也就是说,您遇到的主要问题是其中一项不是列表,因此它没有长度

这里更好的选择是使用生成器表达式和展平列表,然后使用对元素求和

>>> import collections
>>> import itertools
>>> b = [[1,2], [3,4], [5,6], 1]
>>> list(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
[1, 2, 3, 4, 5, 6, 1]
>>> sum(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
22
我们需要生成器表达式,因为
itertools.chain()
不会处理不可iterable项,所以我们将任何项放入列表中以解决此问题

另一种选择是自己制作发电机:

def chain_mixed(iterable):
    for item in iterable:
        try:
            for subitem in item:
                yield subitem
        except TypeError:
            yield item
然后你可以简单地做:

sum(chain_mixed(b))
试试这样的, 仅当元素是
列表
元组
时才使用
sum()
,否则只需使用数字即可

>>> b = [[1,2], [3,4], [5,6], 1]
>>> sum(sum(x) if isinstance(x,(list,tuple)) else x for x in b)
22
改进您的解决方案:

total=0
b = [[1,2], [3,4], [5,6], 1]
for i in range(len(b)) :
    if isinstance(b[i],(list,tuple)):
        for j in range(len(b[i])):
            total += b[i][j]
    else:
        total +=b[i]
print total  #prints 22

一种方法是

def calc_sum(the_list):
    sum = 0
    for item in the_list:
        if isinstance(item,(list,tuple)):
           sum += calc_sum(item)
        else:
           sum += item
    return sum

不是那个蟒蛇。。。但它应该是一个基于生成器的解决方案

>>> b = [[1,2], [3,4], [5,6], 1]
>>> def sum_up(x):
...     for i in x:
...             if isinstance(i, int):
...                     yield i
...             else:
...                     for j in sum_up(i):
...                             yield j
... 
>>> sum(sum_up(b))
22
>>> b = [[1,2], [3,4], [5,6,[3,[6,7]]], 1]
>>> sum(sum_up(b))
38
另一种方法 如果列表包含嵌套列表和整数/浮点数,则此操作有效 在这里,我使用python内置函数“sum”添加列表的所有元素

def add(nested_list):
    temp=[]
    for i in nested_list:
        if isinstance(i,list):
            temp.append(sum(i))
        else:
            temp.append(i)
    print sum(temp)

但如果在其中一个子列表(即
b=[[1,2[1]],[3,4],[5,6],1]
)中有另一层列表,它仍然会失败@JoranBeasley,从OP的方法中可以看出,他只关心列表列表,而不是列表列表。@JoranBeasley这是另一个问题。这个问题没有要求任意嵌套的列表,给出的解决方案也没有表明需要这样的列表。是的,我知道我只是指出了它。。。没有说它不正确或其他任何东西(我给出了这个和@Lattyware的解决方案+1)感谢Ashwini,isinstance()解决了这个问题。我应该一开始就记住它。做得很好-我会这样写,除非我会使用
item如果是instance(item,collections.Iterable)或者[item]
我是Python世界的新手,所以我没有得到你一半的代码,但非常感谢您标记我使用的反模式,并向我介绍生成器表达式和列表理解:)@JonClements好主意,已更改。@Dan如果您是列表comps和生成器表达式的新手,我建议您带一块手表。@Lattyware:非常感谢视频教程。