如何在Python中完全拉平列表?

时间:2018-08-25 12:55:49

标签: python numpy optimization itertools flatten

使列表列表变平是一个众所周知的问题,但是如何以最 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)

1 个答案:

答案 0 :(得分:0)

可能使用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.flatten来更改np.ravel