将一个不规则(任意嵌套)的列表展开为一维列表

553

是的,我知道这个主题以前已经被讨论过:

但据我所知,除了一个解决方案外,所有的解决方案都不能处理像[[[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

这是最好的方法吗?我有遗漏了什么吗?有什么问题吗?


32
这么多答案和讨论表明这个问题应该被内置为一个函数,是吧?尤其遗憾的是,在Python 3.0中移除了compiler.ast。 - Mittenchops
3
我认为Python真正需要的是不受限制的递归,而不是另一个内置函数。 - clay
4
@Mittenchops: 完全不同意,事实上,与明显糟糕的API或过于复杂的数据结构一起工作(仅说明一下:list 应该是同质的)并不意味着这是Python的问题,我们需要为这样的任务建立一个内置功能。 - Azat Ibrakov
7
如果您的项目可以添加软件包,我建议使用more_itertools.collapse解决方案。这个答案来自这里:https://dev59.com/qnNA5IYBdhLWcg3wdtld#40938883 - viddik13
@viddik13:请考虑将其作为此问题的答案,这样我一定会点赞。 (我同意Mittenchops的观点。)事实上,它不是一个内置函数没关系(根据Azat Ibrakov),但是有(并且显然有)一个库例程来完成这个操作。(因为:不是所有的不规则性都是“糟糕的”/“过于复杂的”。有时,它只是...不“规则”,这没关系。在我看来,只要它是明确定义的,并且它可以被定义为不规则的(例如,“整数的任意嵌套列表(列表(列表...))”是明确定义的)。) - lindes
使用递归函数遍历列表树的列表 https://stackabuse.com/python-how-to-flatten-list-of-lists/ - Golden Lion
52个回答

-2
L2 = [o for k in [[j] if not isinstance(j,list) else j for j in [k for i in [[m] if not 
isinstance(m,list) else m for m in L] for k in i]] for o in k]

多重嵌套是冗余的。 - Statham

-2

以下内容可能适用于Python 3:

def get_flat_iter(xparent):
    try:
        r = xparent
        if hasattr(xx, '__iter__'):
            iparent = iter(xparent)
            if iparent != xparent:
                r = map(a, xparent)
    finally:
         pass
    return r

irregular_list = [1, [2, [3, 4]]]
flat_list = list(irregular_list)
print(flat_list) # [1, 2, 3, 4]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接