文章目录

Python 列表推导式:单行生成列表的技巧

发布于 2026-04-09 09:25:31 · 浏览 3 次 · 评论 0 条

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 在后。这与嵌套循环的缩进逻辑是一致的,即“从左到右”对应“从外到内”。

为了更直观地理解数据流转过程,参考以下逻辑流向图:

graph LR A["输入: matrix"] --> B["外层循环: 遍历 row"] B --> C["内层循环: 遍历 num"] C --> D["输出: num"]

5. 复杂逻辑拆解

虽然列表推导式很强大,但不应滥用。

避免 在一行中塞入超过 80 个字符的逻辑,或者包含多层嵌套的复杂判断。当推导式变得难以一眼看清时,优先 使用传统的 for 循环。代码的可读性永远优于代码的简短性。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文