列表推导式(List Comprehension)是 Python 最具特色的语法之一,它能用一行代码完成「循环 + 过滤 + 变换」三件事。学会它,代码立刻简洁一个档次。

基本语法

先看一个对比:

# 普通写法
result = []
for i in range(10):
    if i % 2 == 0:
        result.append(i * i)

# 列表推导式:一行搞定
result = [i * i for i in range(10) if i % 2 == 0]

在交互式解释器里验证效果:

>>> result = [i * i for i in range(10) if i % 2 == 0]
>>> result
[0, 4, 16, 36, 64]

结构可以读成一句话:「对 range(10) 里的每个 i,如果 i 是偶数,就把 i*i 放进新列表」。

带三元表达式的推导式

如果想在「放什么」上做选择,可以在 for 前面加 if-else:

>>> words = ['apple', 'banana', 'cherry']
>>> [w.upper() if len(w) > 5 else w for w in words]
['apple', 'BANANA', 'cherry']

注意区别:

  • for 前面的 if ... else 是三元表达式,必须有 else;
  • for 后面的 if 是过滤器,不能带 else。

嵌套推导式:展平二维列表

>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> [num for row in matrix for num in row]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

嵌套推导式的 for 顺序和普通嵌套循环一致,从左到右读即可。

字典与集合推导式

同样的语法也适用于字典和集合:

>>> names = ['Tom', 'Jerry', 'Spike']
>>> {name: len(name) for name in names}
{'Tom': 3, 'Jerry': 5, 'Spike': 5}

>>> {c for c in 'hello world' if c != ' '}
{'h', 'e', 'l', 'o', 'w', 'r', 'd'}

实用小技巧

# 1. 快速生成序号字典
code_map = {f'{i:03d}': i for i in range(1, 6)}

# 2. 过滤掉空值
raw = ['a', '', 'b', None, 'c']
clean = [s for s in raw if s]

# 3. 求两个列表的交集(先用 set 加速查找)
a, b = [1, 2, 3, 4], [3, 4, 5, 6]
common = [x for x in a if x in set(b)]

小结

  • 逻辑简单时用推导式,超过两层嵌套就换回普通 for 循环,可读性优先;
  • 数据量大且只需要遍历一次时,改用生成器表达式 (x for x in data) 省内存;
  • 推导式是表达式不是语句,可以放进函数参数、返回值里直接使用。