如何在Python中展开深度嵌套的列表?

3
我是一个有用的助手,可以翻译文本。

我得到了一个嵌套列表作为输入。
简化版如下:

myList=[[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]

我希望将其拆分成一个简单的列表嵌套列表。
我可以这样做 -
    simpleList=[]
    for i in myList:
        for j in i:
            simpleList.append(j)

按要求,simpleList如下:
[[1, 2, 3], [4, 5, 6], [2, 3, 4], [3, 4, 5], [4, 6, 7], [5, 7, 9]]
我的问题:
我所做的可能是一种初学者的编程方法。
是否有更专业、高效(以及更符合Python风格)的方法来解压这个嵌套列表?
谢谢。
编辑:
我的方法无法处理深度嵌套的列表。
例如:[[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]]
请参考回答中的评论。

1
sum(myList, []),但使用itertools.chain的解决方案将更有效。 - Faibbus
6
可能是与在Python中将列表的列表变为平面列表重复的问题。 - Chris_Rands
3个回答

4
使用 itertools 中的 chain
from itertools import chain
myList=[[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]
print(list(chain.from_iterable(myList)))   #print(list(chain(*myList)))

输出:

[[1, 2, 3], [4, 5, 6], [2, 3, 4], [3, 4, 5], [4, 6, 7], [5, 7, 9]]

4
改进:print(list(chain.from_iterable(myList))) 意思:输出展开后的myList列表。 - Chris_Rands
1
@Vineet,你也可以使用像我答案中的本地递归方法。 - Mihai Alexandru-Ionut
@Rakesh,看起来这个答案不适用于[[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]] - Mihai Alexandru-Ionut

2
您可以使用一个递归函数来解决任意深度的嵌套列表问题。
def unwrap_list(mylist, result):
   if any(isinstance(i, list) for i in mylist):
      for value in mylist:
         unwrap_list(value, result)
   else:
      result.append(mylist)

mylist = [[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]
result = []
unwrap_list(mylist, result)
print(result)

另一种方法是使用生成器
def flatten(L):
    for item in L:
        if any(isinstance(i, list) for i in item):
          yield from flatten(item)
        else:
          yield item

是的,这可以解决任务。但正如Python习语所说:“简单胜于复杂”,lambda或链式方法可以在一行代码中完成此操作。也许,您提出的解决方案有性能优势。请给予建议。谢谢。 - Vineet
1
@Vineet,这并没有性能上的好处,但是似乎对于下面的例子其他答案都不适用:[[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]] - Mihai Alexandru-Ionut
非常好,@Mihai Alexandru-Ionut。你的方法最恰当地回答了这个问题。我已经接受了这个答案。谢谢。 - Vineet
也许,lambda或chain方法可以以解决问题的方式进行修改。您能分享一下您的知识吗?谢谢。 - Vineet
1
@Vineet,我尝试了 https://dev59.com/qnNA5IYBdhLWcg3wdtld 中的答案,但似乎对于深度任意的列表,你必须使用递归。 - Mihai Alexandru-Ionut
1
我也尝试了那个帖子中的一些答案,但结果错误。我最好还是坚持使用递归来处理深度嵌套的列表。谢谢。 - Vineet

1
myList=[[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]
reduce(lambda x, y: x+y, myList)

输出:

[[1, 2, 3], [4, 5, 6], [2, 3, 4], [3, 4, 5], [4, 6, 7], [5, 7, 9]]

正如 @Mihai Alexandru-Ionut 所指出的,这个解决方案不能处理 [[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9],[[1,2,3],[4,5,6]],[[2,3,4],[3,4,5]],[[4,6,7],[5,7,9]]]]。 - Vineet

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