如何在 Python 中完全展平列表? [复制]

Posted

技术标签:

【中文标题】如何在 Python 中完全展平列表? [复制]【英文标题】:How to completely flatten a list in Python? [duplicate] 【发布时间】:2019-01-31 16:56:20 【问题描述】:

扁平化列表列表是一个众所周知的问题,但是如何以最 pythonic 的方式扁平化 列表列表?我的最终目标是创建一个 numpy 数组,如下所示:

[In]: mylist = [[[1,2,3], [4]], [[5,6], [7,8]]]
[Out]: array([[1, 2, 3, 4],
              [5, 6, 7, 8]])

但即使只是完全展平成一个长列表也可以(无论如何都可以很容易地转换为正确形状的数组)。典型的输出数组将具有维度 (10000, 10),因此循环遍历待处理的行非常低效。我们将不胜感激所有想法!

(编辑)我能想到的最佳解决方案:

import itertools

for i in range(len(mylist)):
    mylist[i] = list(itertools.chain.from_iterable(mylist[i]))
np.array(mylist)

【问题讨论】:

只是为了理解问题,你怎么能有一个循环解决方案来解决你的示例案例? 其实很多乍一看很诱人的解决方案都返回array([list([1, 2, 3]), list([4]), list([5, 6]), list([7, 8])], dtype=object) 这也是我的最爱之一:***.com/a/10632307/7919597 list(map(list, map(itertools.chain.from_iterable, mylist)))? 【参考方案1】:

一种可能是使用numpy.append:

import numpy as np

rows = [[[1, 2, 3], [4]], [[5, 6], [7, 8]]]
result = np.array([np.append(value[0], value[1:]) for value in rows])

print(result)

输出

[[1 2 3 4]
 [5 6 7 8]]

函数numpy.append 扁平化值[1:]。一种替代方法是使用concatenateravel

rows = [[[1], [2], [3]], [[4], [5], [6]]]
result = np.array([np.concatenate(value).ravel() for value in rows])
print(result)

输出

[[1 2 3]
 [4 5 6]]

concatenate 函数连接一系列数组,np.ravel 返回一个连续的扁平数组。您可以将np.ravel 更改为np.flatten。

【讨论】:

好主意,但是当行中有两个以上的列表时,这会失败...rows = [[[1], [2], [3]], [[4], [5], [6]]] 抛出 TypeError。 append 做了很多重定位。与列表追加和扩展不同,它根本不摊销。还是个好主意。 更新了我的答案

以上是关于如何在 Python 中完全展平列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能完全展平一个列表(列表(列表)......)

如何将嵌套列表的两个维度完全展平?

我怎样才能完全展平一个列表(列表(列表)......)

如何在不使用 numpy 的情况下将 2D 列表展平为 1D? [复制]

如何展平Python字典中键的值(元组列表列表)?

Python成语链接(展平)有限迭代的无限迭代? [复制]