python - 如何在不使用 numpy 的情况下将 2D 列表展平为 1D?

标签 python arrays list

我有一个如下所示的列表:

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

我想把它展平成 [1,2,3,1,2,1,4,5,6,7]

有没有不使用 numpy 的轻量级函数?

最佳答案

如果没有 numpy ( ndarray.flatten ),一种方法是使用 chain.from_iterable这是 itertools.chain 的替代构造函数:

>>> list(chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]]))
[1, 2, 3, 1, 2, 1, 4, 5, 6, 7]

或者作为另一种 Pythonic 方法,您可以使用 列表推导:

[j for sub in [[1,2,3],[1,2],[1,4,5,6,7]] for j in sub]

另一种非常适合短列表的函数式方法也可以是 Python2 中的 reduce 和 Python3 中的 functools.reduce(不要将其用于长列表):

In [4]: from functools import reduce # Python3

In [5]: reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])
Out[5]: [1, 2, 3, 1, 2, 1, 4, 5, 6, 7]

为了让它稍微快一点,你可以使用内置的 operator.add,而不是 lambda:

In [6]: from operator import add

In [7]: reduce(add ,[[1,2,3],[1,2],[1,4,5,6,7]])
Out[7]: [1, 2, 3, 1, 2, 1, 4, 5, 6, 7]

In [8]: %timeit reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])
789 ns ± 7.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [9]: %timeit reduce(add ,[[1,2,3],[1,2],[1,4,5,6,7]])
635 ns ± 4.38 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

基准测试:

:~$ python -m timeit "from itertools import chain;chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 1.58 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 0.791 usec per loop
:~$ python -m timeit "[j for i in [[1,2,3],[1,2],[1,4,5,6,7]] for j in i]"
1000000 loops, best of 3: 0.784 usec per loop

使用 sum 的@Will 答案的基准测试(对于短列表来说速度很快,但对于长列表来说不是):

:~$ python -m timeit "sum([[1,2,3],[4,5,6],[7,8,9]], [])"
1000000 loops, best of 3: 0.575 usec per loop
:~$ python -m timeit "sum([range(100),range(100)], [])"
100000 loops, best of 3: 2.27 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[range(100),range(100)])"
100000 loops, best of 3: 2.1 usec per loop

关于python - 如何在不使用 numpy 的情况下将 2D 列表展平为 1D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29244286/

相关文章:

python - 如何在 Pylint 的文件级别禁用 "missing docstring"警告?

python - 重绘时 Bokeh 图失败

javascript - 从数组创建变量

c - 如何在 C 中通过引用来引用二维字符数组

javascript - jQuery - 将列表项的元素 move 到同一项目的另一个元素内+对列表中的每个项目执行此操作

python - Google Cloud Storage - 如何通过 Python 检索文件的所有者?

Python 脚本未在启动时运行 - 树莓派

ios - 如何根据另一个 var 检查数组的内容,通过 if 语句利用警报窗口?

python - 根据外部列表中的值对列表进行排序 (Python)

python - 将重复列表转换为具有相同键的组合列表