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

Dan*_*Dan 2 python nested-lists

我正在添加所有嵌套列表中的元素,到目前为止我所拥有的是

for i in range(len(b)) :
    for j in range(len(b[i])):
        total = total + b[i][j]
Run Code Online (Sandbox Code Playgroud)


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

b = [[1,2], [3,4], [5,6], 1]
Run Code Online (Sandbox Code Playgroud)


在这种情况下,我收到一条错误消息,"int"类型的对象没有len().在这种情况下我该怎么办?

Gar*_*tty 7

首先,您正在为Python程序员展示一个通用的反模式,不循环索引,循环遍历对象本身.例如:

for item in b:
    do_something(item)
Run Code Online (Sandbox Code Playgroud)

而不是:

for i in range(len(b)):
    do_something(b[i])
Run Code Online (Sandbox Code Playgroud)

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

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

这里一个更好的选择就是击败了发电机的表达和列表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
Run Code Online (Sandbox Code Playgroud)

我们需要生成器表达式,因为它itertools.chain()不会处理不可迭代的项,所以我们将任何一个放入列表来解决这个问题.

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

def chain_mixed(iterable):
    for item in iterable:
        try:
            for subitem in item:
                yield subitem
        except TypeError:
            yield item
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地做:

sum(chain_mixed(b))
Run Code Online (Sandbox Code Playgroud)