Skip to content

13|推导式

推导式(comprehension)是一种简洁的语法,用一行代码从现有序列生成新的列表、字典或集合。它本质上是 for 循环的紧凑写法。

一、列表推导式

传统写法:创建空列表,循环,逐个添加。

python
numbers = [1, 2, 3, 4, 5]
squares = []
for n in numbers:
    squares.append(n * n)
# [1, 4, 9, 16, 25]

推导式写法:

python
squares = [n * n for n in numbers]
# [1, 4, 9, 16, 25]

读法从左到右:"对 numbers 中的每个 n,计算 n * n,收集成列表"。

带条件筛选:

python
evens = [n for n in numbers if n % 2 == 0]
# [2, 4]

"对 numbers 中的每个 n,如果 n 是偶数,保留 n"。

条件放在 if 后面,过滤不满足的元素。

二、字典推导式

python
names = ["Alice", "Bob", "Charlie"]
lengths = {name: len(name) for name in names}
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}

花括号加冒号,左边是键,右边是值。

带条件:

python
long_names = {name: len(name) for name in names if len(name) > 3}
# {'Alice': 5, 'Charlie': 7}

交换键值:

python
original = {"a": 1, "b": 2, "c": 3}
swapped = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}

注意:值变成键时,如果原字典的值有重复,交换后会丢失数据(字典键不能重复)。

三、集合推导式

python
numbers = [1, 2, 2, 3, 3, 3]
unique_squares = {n * n for n in numbers}
# {1, 4, 9}

集合推导式自动去重。

四、嵌套推导式

处理二维数据时,推导式可以嵌套:

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

# 转置:行变列
transposed = [[row[i] for row in matrix] for i in range(3)]
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

外层循环在右,内层循环在左。读起来是:"对每个 i,收集 matrix 中每行的第 i 个元素"。

嵌套推导式一行写太多会降低可读性。超过两层嵌套或条件复杂时,展开成普通循环更清晰。

五、推导式 vs 普通循环

推导式适合的场景:

  • 从一个序列生成另一个序列
  • 逻辑简单,一眼能看懂
  • 过滤或转换操作

不适合的场景:

  • 需要副作用(打印日志、修改外部变量)
  • 多层嵌套超过两层
  • 逻辑复杂,一行写不下
python
# 不好的推导式:带副作用
[print(n) for n in range(5)]   # 能跑,但 print 返回 None,列表里是 5 个 None

# 好的写法:用普通循环
for n in range(5):
    print(n)

六、与 map/filter 的比较

Python 还提供了 map()filter() 函数,功能与推导式类似:

python
# map
squares = list(map(lambda x: x * x, numbers))

# filter
evens = list(filter(lambda x: x % 2 == 0, numbers))

# 推导式(推荐)
squares = [x * x for x in numbers]
evens = [x for x in numbers if x % 2 == 0]

推导式在 Python 社区中更受推荐——语法更直观,性能通常也更好。map/filter 配合 lambda 的写法在函数式编程风格中出现,但可读性通常不如推导式。

记忆锚点:推导式是紧凑的 for 循环;[表达式 for 变量 in 序列 if 条件];字典推导式 {k: v for ...};集合推导式 {表达式 for ...};嵌套推导式可读性下降,复杂逻辑用普通循环;推导式不适合有副作用的场景。