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().在这种情况下我该怎么办?
首先,您正在为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)
| 归档时间: |
|
| 查看次数: |
2010 次 |
| 最近记录: |