如何在 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:]。一种替代方法是使用concatenate
和ravel
:
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 中完全展平列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章