当前位置:首页>python>一行代码的艺术:Python列表推导式全攻略

一行代码的艺术:Python列表推导式全攻略

  • 2026-10-11 05:36:38
一行代码的艺术:Python列表推导式全攻略

一行代码的艺术:Python列表推导式全攻略

Rs知识库 · 2026-07-02

列表推导式(List Comprehension)是 Python 最优雅的语法糖之一。它能用一行代码替代 for 循环 + append() 的组合,让代码更简洁、更高效。本文将从基础到进阶,带你彻底掌握列表推导式。

📑 目录
①基础语法:从 for 循环到推导式
②条件过滤:给推导式加上 if
③嵌套循环:多层 for 的优雅写法
④实战案例与常见错误
⑤与其他语言的对比

① 基础语法:从 for 循环到推导式

假设我们有一个数字列表,想把每个数字平方后存入新列表。传统的 for 循环写法需要 3 行代码:

Python · 传统写法
numbers = [1, 2, 3, 4, 5] squares = [] for n in numbers:     squares.append(n ** 2)

用列表推导式,一行搞定:

Python · 推导式写法
squares = [n ** 2for n in numbers]

推导式的通用语法模板是 [表达式 for 变量 in 可迭代对象]。其中"表达式"是对每个元素的处理逻辑,"变量"依次遍历可迭代对象中的值。来看一个更实际的例子——生成一组用户名:

Python
names = ["Alice", "Bob", "Charlie"] usernames = [f"user_{name.lower()}"for name in names] print(usernames) # 输出: ['user_alice', 'user_bob', 'user_charlie']

② 条件过滤:给推导式加上 if

推导式最强大的特性之一是可以在遍历过程中直接过滤数据。语法变为 [表达式 for 变量 in 可迭代对象 if 条件]。下面这个完整的示例展示了如何从一组温度数据中筛选出高于 30°C 的记录,并转换为华氏度:

Python · 条件过滤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 城市温度数据(摄氏度)
temperatures = {
"北京": 32, "上海": 28, "广州": 35,
"深圳": 33, "成都": 26, "杭州": 31
}
# 筛选 > 30°C 的城市,并转换为华氏度
hot_cities = [
f"{city}: {temp * 9/5 + 32}°F"
for city, temp in temperatures.items()
if temp > 30
]
print(hot_cities)
# ['北京: 89.6°F', '广州: 95.0°F', '深圳: 91.4°F', '杭州: 87.8°F']
💡 小贴士

当推导式过长时,可以用方括号换行(如上面第 8-11 行所示),这是 Python 官方推荐的格式化方式,不需要反斜杠续行符。

③ 嵌套循环:多层 for 的优雅写法

当需要遍历多个维度时,推导式支持嵌套 for 子句。下面这个例子生成一副扑克牌的所有组合——4 种花色 × 13 个点数:

Python · 嵌套推导式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
suits = ["♠", "♥", "♦", "♣"]
ranks = ["A", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "J", "Q", "K"]
# 嵌套推导式:生成 52 张牌
deck = [
f"{suit}{rank}
for suit in suits
for rank in ranks
]
print(f"共 {len(deck)} 张牌")
print(deck[:5])
# ['♠A', '♠2', '♠3', '♠4', '♠5']

注意嵌套推导式中 for 子句的顺序:外层循环在前,内层循环在后,这和嵌套 for 循环的书写顺序一致。

④ 实战案例与常见错误

来看一个实用的数据清洗场景:从混合类型的数据列表中,只提取字符串并统一转为小写。这里用到了 isinstance() 做类型检查:

Python · 数据清洗
raw_data = ["Hello", 42, "World", None, "Python", 3.14]  strings = [s.lower() for s in raw_data ifisinstance(s, str)] print(strings) # ['hello', 'world', 'python']

初学者使用推导式时,最容易犯以下错误:

⚠️ 常见错误
❌ 错误 1:修改了不可变对象
my_tuple = (1, 2, 3)[x * 2 for x in my_tuple].append(99)  # 结果被丢弃!
✅ 正确写法:用变量接收结果
result = [x * 2 for x in my_tuple]result.append(99)
❌ 错误 2:推导式内使用赋值语句
[result = x * 2 for x in data]  # SyntaxError!
✅ 正确写法:推导式本身就是表达式
result = [x * 2 for x in data]

⑤ 与其他语言的对比

Python 的列表推导式在其他语言中也有类似实现。JavaScript 使用 Array.map() + Array.filter() 实现类似效果。来看相同逻辑在两种语言中的写法对比:

功能
Python
JavaScript
映射
[x*2 for x in a]
a.map(x => x*2)
过滤
[x for x in a if x>0]
a.filter(x => x>0)
映射+过滤
[x*2 for x in a if x>0]
a.filter(x=>x>0).map(x=>x*2)
嵌套
[f(x,y) for x in a for y in b]
a.flatMap(x=>b.map(y=>f(x,y)))

下面是相同功能在 JavaScript 中的完整实现,可以看到 map + filter 的链式调用风格:

JavaScript
// 等价于 Python 的 [x*2 for x in nums if x > 0]const nums = [-3, -1, 0, 2, 4, -5];  const result = nums   .filter(x => x > 0)   .map(x => x * 2);  console.log(result); // [4, 8]

最后,用一段 Shell 命令快速验证推导式的性能优势:

Shell
python3 -m timeit "[x**2 for x in range(1000)]"python3 -m timeit "list(map(lambda x: x**2, range(1000)))"
🏷️ 知识回顾
基础语法条件过滤嵌套循环数据清洗跨语言对比

列表推导式是 Python 给程序员的「语法情书」

用一行代码,写尽优雅与效率

最新文章

随机文章