Python 中展平列表

2025年03月17日 | 阅读 9 分钟

简介

在 Python 编程语言中,列表被认为是最灵活的数据结构之一。另一方面,二维列表,或称为列表的列表,是一个列表对象,其中每个元素本身就是一个列表。例如:[[19, 18, 17], [16, 15, 14], [13, 12, 11]]。

展平列表的列表是一个将二维列表转换为一维列表的过程,通过解嵌套列表中的每个元素,即将 [[9, 8, 7], [6, 5, 4], [3, 2, 1]] 转换为 [9, 8, 7, 6, 5, 4, 3, 2, 1]。

我们可以通过嵌套的 for 循环、递归、列表推导式、核心函数或导入 Python 的库或包来执行展平过程,具体取决于嵌套列表的深度和规律性。

在本教程中,我们将使用 Python 编程语言来处理展平嵌套列表的各种方法。但在我们开始之前,让我们先了解嵌套列表的类型。

嵌套列表的类型有哪些?

我们知道,Python 是一种弱类型编程语言。因此,我们可能会遇到两种类型的列表的列表。这些列表的列表或嵌套列表如下:

  1. 规则列表的列表
  2. 不规则列表的列表

规则列表的列表

规则列表的列表中的每个项都被称为子列表,从而观察到元素类型的统一性。例如:[[9, 8, 7], [6, 5, 4], [3, 2, 1]] 是一个规则列表的列表,因为 [9, 8, 7], [6, 5, 4], [3, 2, 1] 都是列表类型。

不规则列表的列表

不规则列表的列表中的每个项要么被称为子列表,要么被称为非列表元素(例如,字符串或整数)。因此,元素类型存在不规则性。例如:[[9, 8, 7], [6, 5], 4, 3] 是一个不规则列表的列表,因为 [9, 8, 7] 和 [6, 5] 是列表类型,而 4 和 3 是 int 类型。

使用嵌套 for 循环展平列表的列表

通过嵌套 for 循环展平列表的列表被认为是获得扁平列表的一种暴力方法。我们可以通过选择二维列表中的每个项并将其排列在一维列表中来执行此方法。

让我们看一个适用于规则和不规则列表的例子。

示例

输出

Genuine List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]]
Converted Flat List: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

说明

在上面的示例中,我们定义了一个名为 flattenlist 的函数,它接受一个参数 _2dlist。然后我们使用 for 循环来迭代嵌套列表的元素,并将它们追加以生成一个扁平列表。然后我们定义了嵌套列表并实现了 flattenlist 函数。结果,嵌套列表已成功转换为扁平列表。

使用列表推导式展平嵌套列表

使用列表推导式展平列表的列表被认为是获得扁平列表的一种优雅方法,具体取决于现有的二维列表。然而,这种方法提供的解决方案不太直观。

让我们看一个例子。

示例

输出

Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]]
Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90]

说明

在上面的示例中,我们定义了一个嵌套列表和列表推导式。然后我们为用户打印它们。结果,嵌套列表已成功转换为扁平列表。

使用递归方法展平列表的列表

我们还可以使用递归方法来展平二维列表。让我们看一个实现递归方法以展平列表的列表的示例。此实现适用于规则和不规则列表的列表。

示例

输出

[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

说明

在上面的示例中,我们定义了一个函数并使用了一个 if 语句,声明如果嵌套列表的长度等于零,则返回嵌套列表。

如果零索引上的数据元素是列表的实例,则列表索引再次进入函数,并添加到列表的下一个索引,依此类推。否则,函数将返回元素,依此类推。最后,我们定义了嵌套列表并执行了函数。结果,列表的列表已递归展平。

利用 Python 库

我们还可以利用 Python 编程语言的一些库来展平列表的列表。这些库的实现如下:

使用 functools 和 operator 库展平列表的列表

operator 库提供了 iconcat() 函数来执行连接等基本操作。我们可以将此函数累积地应用于嵌套列表的数据元素,从左到右,从而将嵌套列表减小为扁平列表。

让我们看一个例子来理解其实现。

示例

输出

Given List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110]
Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]

说明

在上面的示例中,我们导入了 functools 库和 operator 库。然后我们定义了一个空列表作为 regularlist。然后我们定义了一个名为 convo 的函数来将列表的列表转换为扁平列表。在此函数中,我们使用了 for 循环,其中元素从嵌套列表中附加到我们之前定义的空列表中。稍后我们定义了嵌套列表并执行了函数。结果,列表的列表已成功转换为扁平列表。

使用 itertools 库展平列表的列表

itertools 库提供了 chain() 函数,它允许我们将嵌套列表转换为一个理想的扁平列表。该函数通过按顺序迭代作为参数传递的可迭代对象来将连续的系列视为一个单独的系列。

让我们看一个例子

示例

输出

The nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]]
The flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

说明

在上面的示例中,我们导入了 itertools 库并生成了一个嵌套列表。然后我们使用了 chain() 函数将给定的嵌套列表转换为扁平列表。最后,我们将结果返回给用户。结果,列表的列表已成功展平。

使用 NumPy 库展平列表的列表

NumPy 库提供了各种日常操作,包括按列或按行连接二维规则数组。我们将使用一个名为 flat 的属性来获得一个展平数组的一维迭代器,以达到目标。让我们看一个例子来理解 concatenate 函数和 flat 属性的用法。

示例

输出

The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]]
The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]

说明

在上面的示例中,我们导入了 numpy 库并定义了一个嵌套列表。然后我们使用了 numpy 库的 concatenate 函数及其 flat 属性来展平嵌套列表的元素,并将它们连接到一个新的扁平列表中。最后,我们为用户打印了结果。因此,列表的列表已成功展平。

利用核心函数

我们还可以利用 Python 编程语言提供的一些核心函数来执行展平任务。

使用 sum 函数展平列表的列表

我们可以将内部列表的求和视为问题的另一种解决方案。我们将两个参数传递给 sum 函数:第一个参数是 iterable,即嵌套列表;第二个参数是 start,在这种情况下是一个空列表,它充当初始的扁平列表,内部子列表的数据元素将被添加进去。

我们可以说这种方法非常方便,因为我们不必导入任何东西。但是,当嵌套列表中存在大量子列表时,它比 itertools()chain() 函数慢。

让我们看一个例子

示例

输出

The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]]
The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90]

说明

在上面的示例中,我们定义了嵌套列表。然后我们使用了 sum() 函数将嵌套列表展平成一维列表,并为用户打印了结果列表。结果,我们成功地将列表的列表转换为扁平列表。

使用 Lambda 关键字展平列表的列表

我们可以使用 lambda 关键字定义一个匿名函数。我们可以将规则/不规则列表作为参数传递给此匿名函数。表达式被求值以获得一个扁平的一维列表。

让我们看一个例子

示例

输出

The Nested list: [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70]
The Flattened List: [10, 20, 30, 30, 50, 60, 40, 60, 70, 70]

说明

在上面的示例中,我们定义了一个嵌套列表。然后我们使用了 lambda 关键字以及定义列表推导式表达式的参数。然后我们为用户打印了它们。结果,我们成功地将二维不规则列表转换为了扁平列表。