在 Python 中展平列表和列表列表的指南

将多维数组转化为一维数组的方法

将多维数组转换为单维数组,这个过程通常被称为“展平”。 解决这个问题有很多种方法,本文将深入探讨几种常见的技巧。

以下是一个例子,展示了我们期望达成的效果:

输入:

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

输出:

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

#1. 循环遍历

最基础且常用的方法是使用循环。 相信大部分读者对这种方法都有所了解。下面我们来详细了解一下使用循环解决问题的步骤:

  • 首先,创建一个包含嵌套列表的虚拟数据,并将其命名为 “data”。
  • 接着,初始化一个空列表,命名为 “flat_list”。
  • 遍历 “data” 中的每一个子列表。
    • 从当前的子列表中提取所有元素。
    • 使用 “list append” 方法将这些元素添加到 “flat_list” 中。
  • 最后,输出 “flat_list”。

以下是使用循环实现展平的代码示例:

    # 初始化数据和一个空列表
    data = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]
    flat_list = []

    # 遍历数据
    for item in data:
      # 将子列表的元素添加到 flat_list
      flat_list += item

    # 输出展平后的列表
    print(flat_list)
  

除了使用连接运算符,你也可以用另一个循环将子列表的元素一个个添加到 “flat_list” 中。 此外,列表推导式也是一种可以替代循环的简洁方法。它们都能达到相同的效果。接下来,我们将介绍另一种解决问题的方法。

#2. 使用 itertools.chain

我们将使用 Python 内置模块 “itertools” 中的 “chain” 方法。

“chain” 方法会遍历每个子列表,并逐个返回其中的元素,直到所有子列表都被遍历完。 它返回一个可迭代对象,因此我们需要将其转换为列表。

以下是使用 “itertools.chain” 方法解决问题的步骤:

  • 初始化一个包含嵌套列表的虚拟数据,并将其命名为 “data”。
  • 使用 “itertools.chain(*data)” 获取展平的可迭代对象。
  • 将生成的可迭代对象转换为列表。
  • 输出展平后的列表。

代码示例:

    # 导入模块
    import itertools

    # 初始化数据
    data = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]

    # 展平列表并存储结果
    flat_list = itertools.chain(*data)

    # 将可迭代对象转换为列表并输出
    print(list(flat_list))
  

#3. 展平多层嵌套列表

前面我们讨论了如何展平列表的列表。 然而,上述方法并不适用于多层嵌套的列表。 请看下面的例子:

输入:

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

输出:

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

由于我们在程序运行之前无法得知列表的嵌套深度,因此我们需要使用递归来解决这个问题。

  • 初始化一个包含多层嵌套列表的虚拟数据,并将其命名为 “data”。
  • 初始化一个空列表,命名为 “flat_list”。
  • 定义一个名为 “flatten_list” 的函数。
    • 遍历传入列表中的每个元素。
    • 如果元素是列表,则递归调用 “flatten_list” 函数,将该元素作为新的参数传入。
    • 如果元素不是列表,则将其添加到 “flat_list” 中。
  • 使用 “data” 调用 “flatten_list” 函数。
  • 函数执行完毕后,”flat_list” 将包含所有展平后的元素。
  • 输出 “flat_list” 以验证结果。

看起来步骤很多,但不用担心,将上述步骤转换为代码只需要几分钟。

    # 初始化数据和空列表
    data = [1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]
    flat_list = []

    # 定义函数
    def flatten_list(data):
        # 遍历数据
        for element in data:
            # 检查是否为列表
            if type(element) == list:
                # 递归调用函数
                flatten_list(element)
            else:
                flat_list.append(element)

    # 展平列表
    flatten_list(data)

    # 输出展平后的列表
    print(flat_list)
  

需要注意的是,我们没有直接修改原有的列表,而是使用原列表中的元素创建了一个新的列表。

总结

希望本教程对你有所帮助。 在 Python 中展平列表还有很多其他方法,但我认为以上几种方法是最简洁易懂的。

祝你编程愉快!🙂