1. 引言
在本教程中,我们将探索在 Python 中展平列表的不同方法。列表展开是指将多维列表转换为一维列表的过程,我们将介绍如何使用 Python 语法和 NumPy 库来分别展平 二维、三维和四维度的列表。
闲话少说,我们直接开始吧!
2. 展开二维列表
让我们首先创建一个名为flatten_2d
的函数,该函数可以展平常见的二维数组。该函数采用list
类型的列表作为输入并返回展开后的列表。代码实现如下:
def flatten_2d(input_list: list) -> list:
flattened = []
for sublist in input_list:
for element in sublist:
flattened.append(element)
return flattened
该函数循环访问输入列表中的每个子列表,并将每个元素追加到展平列表中。最后,它返回展平列表。
为了测试函数,我们可以创建一个 2D 列表并将其传递给 flatten_2d 函数:
list_2d = [[1, 2], [3, 4], [5, 6]]
print(flatten_2d(list_2d))
运行代码,得到结果如下:
[1, 2, 3, 4, 5, 6]
3. 展开三维列表
接下来,让我们创建一个名为flatten_3d
的函数,它可以展平三维数组。该函数遵循与flatten_2d
函数类似的方法,但需要一个额外的循环来处理最外层的列表。
def flatten_3d(input_list: list) -> list:
flattened = []
for sublist in input_list:
for sublist_2 in sublist:
for element in sublist_2:
flattened.append(element)
return flattened
我们使用以下代码进行测试验证:
list_3d = [[[1, 2, 3, 4, 5, 6, 7, 8]]]
print(flatten_3d(list_3d))
得到输出如下:
[1, 2, 3, 4, 5, 6, 7, 8]
4. 展开任意维度的列表
使用原版 Python 语法展平更多维度的列表可能会变得很麻烦,尤其是对于高维数组。此时,推荐大家使用 NumPy 库,它提供了一种简单的方法来平展任何维度的列表。
首先,确保通过在终端中运行 pip install numpy
来安装 NumPy
库。接着,让我们创建一个名为 flatten_any
的函数,该函数使用 NumPy 来展平任何列表。相关函数定义如下:
import numpy as np
def flatten_any(input_list: list) -> list:
np_list = np.array(input_list)
flattened = np_list.flatten()
return flattened.tolist()
上述函数使用 np.array()
将输入列表转换为 NumPy
数组。然后,它使用函数 flatten()
来展平数组。最后,它使用 tolist()
函数将扁平化的NumPy
数组转换回常规的Python
中的列表。
为了测试函数,我们可以创建一个 4D 列表并将其传递给 flatten_any
函数:
list_4d = [[[[1, 2, 3, 4, 5, 6, 7, 8]]]]
print(flatten_any(list_4d))
得到输出如下:
[1, 2, 3, 4, 5, 6, 7, 8]
5. 使用itertools.chain展开列表
事实上,更进一步我们可以使用函数itertools.chain
,来将我们的输入original_list
中的内部列表连接成一个序列,而无需显示创建新的列表,只需要使用list(...)
将结果转化为常规列表即可,代码如下:
import itertools
original_list = [[1, 2, 3], [4, 5], [6, 7, 8]]
flattened_list = list(itertools.chain(*original_list))
print(flattened_list)
得到结果如下:
[1, 2, 3, 4, 5, 6, 7, 8]
使用上述方法,可以有效地展平Python
中的多维嵌套列表。
6. 总结
Python中的展平列表可以使用各种方法实现。我们探索了四种不同的方法:使用Python的原生语法来扁平化2D和3D列表,以及使用NumPy库展平任意维度的列表。每种方法都有自己的优点和局限性,因此请选择需要来选择最适合自己需求的方法。
标签:函数,Python,list,展平,列表,flattened,flatten,多维 From: https://blog.51cto.com/u_15506603/7969322