如何在 Python 中展平列表列表
了解如何在 Python 中展平列表列表。将嵌套列表推导式、itertools.chain、sum 和递归方法与代码示例进行比较。
概述
在处理矩阵计算、数据库行或解析数据树时,您会经常遇到嵌套结构,例如列表列表:“[[1, 2], [3, 4]]”。扁平化此结构意味着将其转换为包含所有单个元素的一维列表:“[1, 2, 3, 4]”。 Python 提供了几种优雅的方法来实现这一点。
展平列表列表的最常见和 Pythonic 方法是使用嵌套列表理解:“[item for sublist in matrix for item in sublist]”。虽然语法一开始看起来有点违反直觉,因为循环的编写顺序与嵌套的“for”循环相同,但它是高度优化的、快速的,并且不需要导入外部库。
或者,您可以使用“itertools”模块的“chain.from_iterable()”函数。这是最节省内存的方法,因为它返回一个延迟生成元素的迭代器,而不是立即在内存中分配新列表。对于深度嵌套的列表(任意深度),您必须编写一个递归生成器函数来解压所有级别。
代码和执行输出
此脚本演示了如何使用列表推导式、itertools.chain 和递归解包来展平列表列表。
flatten_list.py
在编辑器中尝试import itertools
matrix = [[1, 2, 3], [4, 5], [6, 7, 8]]
# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)
# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)
# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]
def flatten_deep(items):
result = []
for item in items:
if isinstance(item, list):
result.extend(flatten_deep(item))
else:
result.append(item)
return result
print("Deep flatten:", flatten_deep(irregular))端子输出
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]逐步实施
- 对平面 2D 结构使用嵌套列表理解 [nested_list 中的子列表的项目 for sublist 中的项目]。
- 导入 itertools 并调用 itertools.chain.from_iterable(nested_list) 进行惰性、内存友好的评估。
- 定义一个递归函数检查 isinstance(item, list) 来处理任意嵌套的集合。
常见问题解答
我可以使用 sum() 函数来展平列表吗?
是的, sum(matrix, []) 可以工作,但强烈建议不要这样做。它的运行复杂度为 O(N^2),因为它在每次添加时都会创建一个新的列表副本,从而导致大型数据集的性能很差。
展平列表列表最快的方法是什么?
itertools.chain.from_iterable() 通常是最快的,紧随其后的是嵌套列表推导式。
相关主题
推荐的 Python 资源
通过相关的交互式教程、备忘单和代码比较来扩展您的知识。