【问题标题】:How to completely flatten a list in Python? [duplicate]如何在 Python 中完全展平列表? [复制]
【发布时间】: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)
  • 这也是我的最爱之一:stackoverflow.com/a/10632307/7919597
  • list(map(list, map(itertools.chain.from_iterable, mylist)))?

标签: python numpy optimization itertools flatten


【解决方案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 做了很多重定位。与列表追加和扩展不同,它根本不摊销。还是个好主意。
  • 更新了我的答案
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 2019-10-31
  • 1970-01-01
  • 2013-12-05
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多