将列表中的列表分解为元素不可迭代的单一列表
参考资料: 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']