繁体   English   中英

添加所有嵌套列表中的元素

[英]adding up the elements from all of the 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 item in b:
    do_something(item)

而不是:

for i in range(len(b)):
    do_something(b[i])

它更清晰,更简单,更快捷。

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

这里更好的选择是使用生成器表达式和itertools.chain.from_iterable()来展平列表,然后使用sum()内置函数对元素求和。

>>> 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()不会处理不可迭代的项,所以我们将任何一个放入列表来解决这个问题。

另一种方法是制作自己的发电机:

def chain_mixed(iterable):
    for item in iterable:
        try:
            for subitem in item:
                yield subitem
        except TypeError:
            yield item

然后你可以简单地做:

sum(chain_mixed(b))

尝试这样的事情,只有当元素是一个listtuple时才使用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

基于发电机的解决方案

>>> 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

一种方法是

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

不是那个pythonic ...但它应该工作

另一种方法

如果列表包含嵌套列表和整数/浮点数,这将有效这里我使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM