【Python】将Python中的多维列表进行展开

news/2024/11/20 1:30:40/

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))

得到输出如下:

[12345678]

4. 展开任意维度的列表

使用原版 Python 语法展平更多维度的列表可能会变得很麻烦,尤其是对于高维数组。此时,推荐大家使用 NumPy 库,它提供了一种简单的方法来平展任何维度的列表。

首先,确保通过在终端中运行 pip install numpy 来安装 NumPy库。接着,让我们创建一个名为 flatten_any 的函数,该函数使用 NumPy 来展平任何列表。相关函数定义如下:

import numpy as npdef 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 itertoolsoriginal_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库展平任意维度的列表。每种方法都有自己的优点和局限性,因此请选择需要来选择最适合自己需求的方法。


http://www.ppmy.cn/news/1168766.html

相关文章

前端HTML CSS JS风格规范

本文代码规范来自HTML/CSS代码开发规范文档 文件命名规范 使用小写字母、数字和下划线组成文件名。 避免使用特殊字符和空格。 使用语义化的命名,能够清晰地表达出文件的功能或内容。 目录结构规范 使用约定俗成的目录结构,如:src/compon…

C语言字符型

字符型变量作用 作用: 字符型变量用于显示单个字符 如:a、b、c、d、\n等等 字符型变量语法和使用 语法: char 变量名 字符; 如: char a ‘a’; 注意:字符型是用的单引号 ‘ ’ ,并且是单个…

JS随机数功能详解

目录 一、Math.random()函数 二、生成指定范围内的随机整数 三、生成指定范围内的随机浮点数 四、生成指定范围内的随机布尔值 JavaScript中的随机功能可以通过Math对象提供的各种数学函数来实现。其中最常用的是Math.random()函数,它可以返回一个介于0和1之间的…

java的for循环中遇到异常抛出后继续循环执行

java的for循环中遇到异常抛出后继续循环执行 Test public void loopTryCatchTest() throws Exception {Map<String, Object> a new HashMap();a.put("a", "1");a.put("b", null);a.put("c", "3");for (Map.Entry<…

192:最近的系列思考2/犬岛APP 的使用理解

最近的一些契机&#xff0c;导致一些思考&#xff1a; ​ * 与产品经理意志相悖的产品* 与最初的设计定位不匹配的产品社交大牛的APP一上线就引来诸多关注&#xff0c;作为总设计的纯大大非常简明扼要的说明了这个APP的定位&#xff1a;给内涵&#xff08;含&#xff09;有趣的…

写一个简单的解释器(1) 编译过程简介

编译过程 一般来说&#xff0c;将一份源代码编译为可执行文件包含下面的关键步骤&#xff1a; 源文件 ⇒ 构建标记流 ⇒ 构建编译树 ⇒ 生成可执行文件 \texttt{源文件}\Rightarrow \texttt{构建标记流}\Rightarrow \texttt{构建编译树}\Rightarrow\texttt{生成可执行文件} 源…

Leetcode刷题解析——串联所有单词的子串

1. 题目链接&#xff1a;30. 串联所有单词的子串 2. 题目描述&#xff1a; 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["…

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 &#xff08;164&#xff09;MR跑得慢的原因&#xff08;165&#xff09;MR常用调优参数Map阶段Reduce阶段 &#xff08;166&#xff09;MR数据倾斜问题参考文献 &#xff08;164&#xff09;MR跑得慢的原因 MR程序执行效率的瓶颈&#xff0c;或者说当你觉得你的MR程…