Python 列表推导式:单行生成列表的技巧
Python 列表推导式是一种将现有列表(或任何可迭代对象)转换为新列表的简洁方法。它将多行循环压缩为单行代码,既提高了代码的可读性,也提升了执行效率。
1. 基础用法:生成平方数列表
最基础的列表推导式包含三个核心部分:输出表达式、循环变量和可迭代对象。
打开 Python 交互环境或代码编辑器。
输入 传统的 for 循环代码,生成一个包含 0 到 9 的平方数的列表:
squares = []
for x in range(10):
squares.append(x**2)
print(squares)
替换 上述代码为以下列表推导式写法:
squares = [x**2 for x in range(10)]
print(squares)
观察 结果 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]。
在这个例子中,x**2 是输出表达式,x 是循环变量,range(10) 是可迭代对象。
2. 添加过滤条件:仅保留偶数平方
如果不需要转换列表中的每一个元素,而是需要筛选,可以在推导式末尾添加 if 条件。
修改 需求,现在只需要 0 到 9 中偶数的平方。
在传统写法中,你需要 添加 一个 if 判断语句:
even_squares = []
for x in range(10):
if x % 2 == 0:
even_squares.append(x**2)
简化 代码,在列表推导式的末尾 追加 if 条件:
even_squares = [x**2 for x in range(10) if x % 2 == 0]
运行 代码,输出结果为 [0, 4, 16, 36, 64]。
此时,if 语句充当过滤器,仅让满足 x % 2 == 0 的数据进入输出列表。
3. 值转换:使用 If-Else 修改输出
区分“过滤”和“值转换”非常重要。如果希望保留所有数字,但改变其显示形式(例如,偶数保持原样,奇数变为 0),不能将 if 放在末尾。
编写 以下代码,将 if-else 结构 移动 到循环之前:
processed = [x if x % 2 == 0 else 0 for x in range(10)]
查看 输出 [0, 0, 2, 0, 4, 0, 6, 0, 8, 0]。
为了更清晰地理解两种条件的区别,请参考下表:
| 写法类型 | 语法结构 | 作用描述 | 结果数量 |
|---|---|---|---|
| 过滤模式 | [exp for var in list if condition] |
筛选满足条件的元素 | 少于或等于原列表 |
| 转换模式 | [exp1 if condition else exp2 for var in list] |
对所有元素进行不同的处理 | 等于原列表 |
4. 嵌套循环:展平二维矩阵
列表推导式可以处理多层循环,常用于展平二维列表。
定义 一个二维列表(矩阵):
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
使用 双重 for 循环将其展平为一维列表:
flattened = []
for row in matrix:
for num in row:
flattened.append(num)
重写 为单行的列表推导式:
flattened = [num for row in matrix for num in row]
注意 书写顺序:外层循环 for row in matrix 在前,内层循环 for num in row 在后。这与嵌套循环的缩进逻辑是一致的,即“从左到右”对应“从外到内”。
为了更直观地理解数据流转过程,参考以下逻辑流向图:
5. 复杂逻辑拆解
虽然列表推导式很强大,但不应滥用。
避免 在一行中塞入超过 80 个字符的逻辑,或者包含多层嵌套的复杂判断。当推导式变得难以一眼看清时,优先 使用传统的 for 循环。代码的可读性永远优于代码的简短性。

暂无评论,快来抢沙发吧!