小编典典

展平不规则的列表列表

all

但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:

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)

这是最好的模型吗?我忽略了什么吗?任何问题?


阅读 87

收藏
2022-03-13

共1个答案

小编典典

使用生成器函数可以使您的示例更易于阅读,并可能提高性能。

蟒蛇2

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

蟒蛇 3

在 Python 3 中,basestring不再存在,但您可以使用str和的元组bytes来获得相同的效果。

运算符一次从生成器yield from返回一个项目。这种用于委派给子生成器的语法是在
3.3 中添加的

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
2022-03-13