列表推导式

基本语法

1
[表达式 for 变量 in 可迭代对象 if 条件]

等价于:

1
2
3
4
result = []
for 变量 in 可迭代对象:
if 条件:
result.append(表达式)
  • 可以省略 if(表示不过滤);
  • 表达式部分可以是任意计算或函数调用;
  • 推导式返回的是一个新的列表对象

常见用法

  1. 过滤元素

    1
    2
    [x for x in nums if x % 2 == 0]
    → [2, 4]
  2. 嵌套循环

    1
    2
    [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
    → [(1,3),(1,4),(2,3),(2,1),(2,4),(3,1),(3,4)]
  3. 二维展开

    1
    2
    [x for row in matrix for x in row]
    → [1,2,3,4,5,6]

技巧与陷阱

项目 要点
执行顺序 从左到右写,左外右内执行
可读性 不建议嵌套超过两层,否则不如显式 for
性能 较普通循环更快(底层优化),但不是“懒加载”

推导式 = 简洁高效的 for + if 语法糖,Pythonic 的核心语法之一。

特点:

  • 有顺序;
  • 可重复;
  • 结果是列表;
  • 最常用。

集合推导式

语法:

1
{表达式 for 变量 in 可迭代对象 if 条件}

示例:

1
2
{x for x in [1, 2, 2, 3, 3]}
→ {1, 2, 3}

特点:

  • 无序;
  • 自动去重;
  • 结果是集合。

字典推导式

语法:

1
{键表达式: 值表达式 for 元素 in 可迭代对象 if 条件}

示例:

1
2
{x: x**2 for x in range(5)}
→ {0:0, 1:1, 2:4, 3:9, 4:16}

特点:

  • 键唯一;
  • 可用于字典反转、过滤、转换。

生成器表达式

语法:

1
(表达式 for 变量 in 可迭代对象 if 条件)

示例:

1
(x**2 for x in range(5))

特点:

  • 惰性求值:不立即生成所有元素;
  • 节省内存;
  • 通常与 fornext() 一起使用;
  • 返回一个生成器对象。

记忆表格

类型 括号符号 是否惰性 是否去重 是否映射键值
列表 []
集合 {}
字典 {k:v} 键唯一
生成器 () ✅ 是

常见误区

  1. 嵌套太多(>2 层)会严重影响可读性;
  2. 集合和字典无序;
  3. 推导式执行顺序是 左外右内
  4. 生成器表达式返回的是可迭代对象,不是列表。

💡 总结:

推导式让代码更简洁、更 Pythonic,但要“用得清晰,不要炫技”。