但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:
L = [[[1, 2, 3], [4, 5]], 6]
所需的输出在哪里
[1, 2, 3, 4, 5, 6]
或者甚至更好,一个迭代器。我看到的唯一适用于任意嵌套的解决方案是在这个问题中找到:
def flatten(x): result = [] for el in x: if hasattr(el, "__iter__") and not isinstance(el, basestring): result.extend(flatten(el)) else: result.append(el) return result flatten(L)
这是最好的模型吗?我忽略了什么吗?任何问题?
使用生成器函数可以使您的示例更易于阅读,并可能提高性能。
def flatten(l): for el in l: if isinstance(el, collections.Iterable) and not isinstance(el, basestring): for sub in flatten(el): yield sub else: yield el
我使用了2.6 中添加的Iterable ABC 。
在 Python 3 中,basestring不再存在,但您可以使用str和的元组bytes来获得相同的效果。
basestring
str
bytes
运算符一次从生成器yield from返回一个项目。这种用于委派给子生成器的语法是在 3.3 中添加的
yield from
from collections.abc import Iterable def flatten(l): for el in l: if isinstance(el, Iterable) and not isinstance(el, (str, bytes)): yield from flatten(el) else: yield el