将列表中的列表分解为元素不可迭代的单一列表

1 投票
5 回答
1658 浏览
提问于 2025-04-16 20:24

参考资料: python 拆分列表 在 Python 中扁平化一个浅层列表

虽然上面提到的解决方案很有帮助,但我的问题稍微有点不同,我想知道有没有一种更符合 Python 风格的方法来解决它。

a = [['a-3','b-3'],'r',['j']]

我想要的是一种干净的方式,让 'a' 等于以下内容:

a = ['a-3','b-3','r','j']

我现在使用的是 Python 2.4,所以如果有兼容 2.4 的 Python 风格的解决方案就太好了,不过我也会对 2.7 及以上版本的例子感兴趣。

主要的问题是有一些不可迭代的元素,否则使用 sum(lst,[]) 的方法效果很好,2.7 及以上版本的链式方法也不错。

5 个回答

2
def flatten(L):
    if not L:
        return L
    elif isinstance(L[0], list):
        return flatten(L[0]) + flatten(L[1:])
    else:
        return [L[0]] + flatten(L[1:])

希望这能帮到你

2

这样怎么样:

itertools.chain.from_iterable(map(lambda i: i if type(i) == list else [i], a))

或者,为了更容易阅读:

def assure_is_list(a):
   return a if type(a) == list else [a]

itertools.chain.from_iterable(map(assure_is_list, a))
5

“Pythonic”这个词可以有很多意思。根据可读性很重要(PEP 20)的原则,我想分享一下我的看法:

def dec(input_, output_):
    if type(input_) is list:
        for subitem in input_:
            dec(subitem, output_)
    else:
        output_.append(input_)

举个例子:

input_ = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
output_ = ['a-3', 'b-3', 'x', 'hello', '3', 'b', 'r', 'j']

撰写回答