# 将不规则的Python多维数组拉平到一维，你学废了吗？

```l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9]
```

```l = [[1, 2], [3, 4], [5, [6, 7, [8, 9]]], 10, [11, [12, 13, [14, 15, [16]]]]]
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
```

## 使用numpy拉平数组

```import numpy as np

np.array(l).flatten().tolist()
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9]
```

## 使用python拉平数组

```l = [[1, 2, 3], [4, 5], [6, 7], [8, 9, 10, 11]]
np.array(l).flatten().tolist()
```
`D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray`

```[[1, 2, 3], [4, 5], [6, 7], [8, 9, 10, 11]]
```

```import itertools

list(itertools.chain(*l))
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
```

```sum(l, [])
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
```

```result = []
for i in l:
result += i
result
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
```

`sum(l, [])`的第一个参数是被迭代的容器，第二个元素是一个初始值，它的工作机制与函数式编程的reduce思想是一样的，用一个初始值不停的迭代操作目标的每个元素累加到初始对象中。

## 将不规则多维数组拉平到1维

```l = [[1, 2], [3, 4], [5, [6, 7, [8, 9]]], 10, [11, [12, 13, [14, 15, [16]]]]]
```

```list_str = str(l).replace("[", "").replace("]", "")
eval(f"[{list_str}]")
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
```

```import re

eval(re.sub("(?!^)\[|\](?!\$)", "", str(l)))
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
```

## 深度优先遍历策略拉平多维数组

```def flatten(items, result=[]):
for item in items:
if isinstance(item, list):
flatten(item, result)
else:
result.append(item)

result = []
flatten(l, result)
result
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
```

```def flatten(items):
for item in items:
if isinstance(item, list):
yield from flatten(item)
else:
yield item

result = [e for e in flatten(l)]
result
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
```

```from collections import deque

stack = deque(l)
result = []
while len(stack) != 0:
item = stack.popleft()
if isinstance(item, list):
for e in reversed(item):
stack.appendleft(e)
else:
result.append(item)
result
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
```

```from collections import deque

stack = l.copy()
result = deque()
while len(stack) != 0:
item = stack.pop()
if isinstance(item, list):
for e in item:
stack.append(e)
else:
result.appendleft(item)
result = list(result)
result
```

```[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
```

## 小结

0 条评论

• ### 『统计学』最常用的数据分析方法都在这了！Part.2

主成分分析（Principal Component Analysis，PCA）， 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的...

• ### 数据运营36计(三)：熵权法如何确定指标权重构建评价体系

信息论基本原理解释信息是系统有序性的度量单位，而熵可以度量系统的无序程度；如果某个指标的信息熵越小，该指标提供的信息量越大，指标变异程度(方差)高，因此在综合评...

• ### Python实现数据写入 Excel 的三种模块！

本文说明如何使用 xlsxwriter、pandas、openpyxl 三个库来实现数据写入 Excel，写入后的格式如下图所示：

• ### ‘StringBuilder‘ can be replaced with ‘String‘

报告StringBuffer，StringBuilder或StringJoiner的所有用法，这些用法可以用单个java.lang.String串联代替。使用S...

• ### 3分钟短文 | Laravel 内3种数据校验的写法，你喜欢哪一个？

web应用程序公开访问几乎没有不带用户交互的，难免要接收用户输入的奇奇怪怪的东西。对于后端程序，必须对输入的内容进行有效性过滤。

• ### 用nodejs xml2js读取xml文件

读取这个配置文件的JavaScript代码，使用了nodejs里的xml2js模块：

• ### Django 2.1.7 上传图片 - Admin后台管理

Django 2.1.7 Admin管理后台 - 注册模型、自定义显示列表字段 Django 2.1.7 Admin - 列表页选项 Django 2.1....

,,