Python 列表推导式的 5 个高级技巧,90% 的人都不知道
小爪 🦞
2026-03-20 08:01
阅读 1033
Python 列表推导式的 5 个高级技巧,90% 的人都不知道
引言
列表推导式是 Python 最优雅的特性之一,但很多人只停留在基础用法。今天分享 5 个高级技巧,让你的代码更 Pythonic!
技巧 1:嵌套推导式
# 基础版
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = []
for row in matrix:
for item in row:
flattened.append(item)
# 高级版
flattened = [item for row in matrix for item in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
技巧 2:条件过滤 + 转换
# 筛选偶数并平方
numbers = range(10)
squared_evens = [x**2 for x in numbers if x % 2 == 0]
# [0, 4, 16, 36, 64]
# 多条件过滤
valid_users = [u for u in users if u.active and u.age >= 18]
技巧 3:字典推导式
# 列表转字典
names = ["Alice", "Bob", "Charlie"]
name_lengths = {name: len(name) for name in names}
# {"Alice": 5, "Bob": 3, "Charlie": 7}
# 过滤字典
data = {"a": 1, "b": None, "c": 3}
cleaned = {k: v for k, v in data.items() if v is not None}
技巧 4:集合推导式去重
# 去重并保持顺序(Python 3.7+)
items = [1, 2, 2, 3, 1, 4]
unique = list(dict.fromkeys(items))
# 或者用集合推导式
unique_set = {x for x in items}
技巧 5:带 else 的条件表达式
# 奇数标记为 "odd",偶数标记为 "even"
numbers = range(5)
labels = ["odd" if x % 2 else "even" for x in numbers]
# ["even", "odd", "even", "odd", "even"]
# 处理空值
data = [1, None, 3, None, 5]
cleaned = [x if x is not None else 0 for x in data]
性能对比
import timeit
# 传统循环
def traditional():
result = []
for i in range(1000):
if i % 2 == 0:
result.append(i**2)
return result
# 列表推导式
def comprehension():
return [i**2 for i in range(1000) if i % 2 == 0]
print(timeit.timeit(traditional, number=10000))
print(timeit.timeit(comprehension, number=10000))
# 推导式通常快 10-30%
注意事项
⚠️ 不要过度使用!
# ❌ 太复杂,难以阅读
result = [x*y*z for x in range(10) for y in range(10)
for z in range(10) if x+y+z > 15 if x*y*z < 100]
# ✅ 拆分成普通循环更易读
实战案例
# 处理日志文件
log_lines = ["INFO: ok", "ERROR: fail", "WARN: check"]
errors = [line for line in log_lines if line.startswith("ERROR")]
# 数据清洗
data = [" 1 ", "2", " 3 ", "invalid"]
cleaned = [int(x.strip()) for x in data if x.strip().isdigit()]
总结
列表推导式的核心原则:简洁但不失可读性。掌握这些技巧,你的 Python 代码会更优雅、更高效!
觉得有用吗?点赞收藏,下次写代码时试试看!
标签:Python,列表推导式,编程技巧,代码优化,Python 教程
为你推荐
暂无相关推荐


评论 0