Python列表推导式(list comprehension)用一行表达式生成列表,用来代替空列表加 for 再 append 那种写法。基本形态是 [表达式 for 变量 in 可迭代对象],还可以加条件做过滤。

循环写法与推导式对照

生成 0 到 9 的平方,手写循环通常要三行:

squares = []
for i in range(10):
    squares.append(i * i)
print(squares)   # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

换成推导式可以收成一行:

squares = [i * i for i in range(10)]
print(squares)   # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

阅读顺序是:先看要生成什么(表达式),再看数据从哪来(for … in …)。

基础写法

# 对每个元素做变换
names = ["alice", "bob", "carol"]
upper_names = [n.upper() for n in names]
print(upper_names)   # ['ALICE', 'BOB', 'CAROL']

# 从字符串拆
chars = [c for c in "Python"]
print(chars)         # ['P', 'y', 't', 'h', 'o', 'n']

带条件:过滤

在 for 后面加 if,只保留满足条件的元素:

Python 列表推导式带条件过滤示例运行
nums = [1, 2, 3, 4, 5, 6]
evens = [n for n in nums if n % 2 == 0]
print(evens)   # [2, 4, 6]

words = ["hi", "", "world", "", "py"]
non_empty = [w for w in words if w]
print(non_empty)   # ['hi', 'world', 'py'],空串是假值被过滤

带 else 的条件表达式

若每个元素都要产出一个值,把三元表达式写在 for 前面:

nums = [1, 2, 3, 4]
tags = ["even" if n % 2 == 0 else "odd" for n in nums]
print(tags)   # ['odd', 'even', 'odd', 'even']

嵌套循环

pairs = [(x, y) for x in range(3) for y in range(3)]
print(pairs)
# [(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]

清洗数据示例

data = [" 12 ", "34", "  ", "56", "-1"]
clean = [int(x.strip()) for x in data if x.strip().isdigit()]
print(clean)   # [12, 34, 56]

这里先 strip 去掉空白,再用 isdigit 筛掉非数字,最后转成 int。过滤和转换写在同一条推导式里。

关于效率

推导式通常比手写 append 循环更短,在数据量较大时也往往更快,因为少了一层方法调用开销。可读性仍优先:表达式一旦堆得太复杂,拆回普通循环更合适。

两道小练习

写一个推导式,生成 1 到 20 中能被 3 整除的数的平方列表。另写一个:把一句英文拆成单词,去掉长度小于 3 的项。