如何取消嵌套列表?

cod*_*ous 35 python

可能重复:
在Python中列出列表列表中的平面列表

我试图找到一种简单的方法将多维(嵌套)python列表转换为单个列表,其中包含子列表的所有元素.

例如:

A = [[1,2,3,4,5]]
Run Code Online (Sandbox Code Playgroud)

转向

A = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

要么

A = [[1,2], [3,4]]
Run Code Online (Sandbox Code Playgroud)

转向

A = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

moo*_*eep 43

使用itertools.chain:

itertools.chain(*iterables):

创建一个迭代器,它返回第一个iterable中的元素,直到它耗尽,然后进入下一个iterable,直到所有的iterables都用完为止.用于将连续序列作为单个序列处理.

例:

from itertools import chain

A = [[1,2], [3,4]]

print list(chain(*A))
# or better: (available since Python 2.6)
print list(chain.from_iterable(A))
Run Code Online (Sandbox Code Playgroud)

输出是:

[1, 2, 3, 4]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

  • 澄清列表中的所有对象本身都必须是列表很有用。例如,如果 'A= ['year', [1] ]' 则 'chain' 将不会产生预期结果。它需要 'A = [['year'], [1]]'。 (2认同)

lol*_*llo 27

使用reduce功能

reduce(lambda x, y: x + y, A, [])
Run Code Online (Sandbox Code Playgroud)

要么 sum

sum(A, [])
Run Code Online (Sandbox Code Playgroud)

  • @JoelCornett有什么问题吗?对newcomers/noncognoscenti没有帮助评论 (19认同)
  • Python 3 中删除了“reduce”。“sum”版本可以工作,但“itertools.chain”方法要快得多。 (3认同)

cod*_*ous 7

第一种情况也可以轻松完成:

A=A[0]
Run Code Online (Sandbox Code Playgroud)

  • OP写道“[[1,2],[3,4]]”应该变成“[1,2,3,4]”。您的解决方案返回“[1,2]”! (10认同)

nd.*_*nd. 7

itertools为此提供了链函数:

来自http://docs.python.org/library/itertools.html#recipes

def flatten(listOfLists):
    "Flatten one level of nesting"
    return chain.from_iterable(listOfLists)
Run Code Online (Sandbox Code Playgroud)

请注意,结果是一个可迭代的,因此您可能需要list(flatten(...)).