3 回答

TA贡献1797条经验 获得超4个赞
>>> from collections import Iterable
>>> from itertools import chain
单线:
>>> list(chain.from_iterable(item if isinstance(item,Iterable) and
not isinstance(item, basestring) else [item] for item in lis))
[1, 2, 3, 4, 5, 6, 7, 8]
可读版本:
>>> def func(x): #use `str` in py3.x
... if isinstance(x, Iterable) and not isinstance(x, basestring):
... return x
... return [x]
...
>>> list(chain.from_iterable(func(x) for x in lis))
[1, 2, 3, 4, 5, 6, 7, 8]
#works for strings as well
>>> lis = [[1, 2, 3], [4, 5, 6], 7, 8, "foobar"]
>>> list(chain.from_iterable(func(x) for x in lis))
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']
使用嵌套列表理解:(与相比,速度会很慢itertools.chain):
>>> [ele for item in (func(x) for x in lis) for ele in item]
[1, 2, 3, 4, 5, 6, 7, 8, 'foobar']

TA贡献1871条经验 获得超8个赞
没有人给出通常的答案:
def flat(l): return [y for x in l for y in x]
在StackOverflow周围有这个问题的虚假信息。

TA贡献1833条经验 获得超4个赞
您正在尝试遍历一个数字,而这个数字是您无法做到的(因此会出现错误)。
如果您使用的是python 2.7:
>>> from compiler.ast import flatten
>>> flatten(l)
[1, 2, 3, 4, 5, 6, 7, 8]
但请注意,该模块现已弃用,并且在Python 3中不再存在
添加回答
举报