Python推导式详解与应用
Python 推导式详解
推导式(Comprehension)是 Python 中一种简洁、高效的数据结构构建方式,可以用更少的代码创建列表、字典、集合等。
1. 列表推导式 (List Comprehension)
基本语法
[expression for item in iterable]
示例
# 传统方式
squares = []
for i in range(5):squares.append(i**2)
print(squares) # [0, 1, 4, 9, 16]# 列表推导式
squares = [i**2 for i in range(5)]
print(squares) # [0, 1, 4, 9, 16]
带条件的列表推导式
# 只包含偶数的平方
even_squares = [i**2 for i in range(10) if i % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]# 条件表达式
results = ["偶数" if i % 2 == 0 else "奇数" for i in range(5)]
print(results) # ['偶数', '奇数', '偶数', '奇数', '偶数']
多重循环
# 两个列表的组合
pairs = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(pairs) # [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
2. 字典推导式 (Dictionary Comprehension)
基本语法
{key_expression: value_expression for item in iterable}
示例
# 创建数字与其平方的字典
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}# 转换字典的键值对
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {v: k for k, v in original.items()}
print(swapped) # {1: 'a', 2: 'b', 3: 'c'}# 带条件的字典推导式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
3. 集合推导式 (Set Comprehension)
基本语法
{expression for item in iterable}
示例
# 创建唯一平方数的集合
squares_set = {x**2 for x in [1, -1, 2, -2, 3]}
print(squares_set) # {1, 4, 9}# 从字符串中提取唯一字符
unique_chars = {char for char in "hello world" if char != ' '}
print(unique_chars) # {'h', 'e', 'l', 'o', 'w', 'r', 'd'}
4. 生成器表达式 (Generator Expression)
基本语法
(expression for item in iterable)
示例
# 生成器表达式 - 惰性求值,节省内存
squares_gen = (x**2 for x in range(5))
print(squares_gen) # <generator object <genexpr> at 0x...># 使用生成器
for square in squares_gen:print(square, end=' ') # 0 1 4 9 16# 生成器只能使用一次
print(list(squares_gen)) # [] - 已耗尽
5. 嵌套推导式
示例
# 创建二维列表
matrix_2d = [[i * 3 + j for j in range(3)] for i in range(3)]
print(matrix_2d) # [[0, 1, 2], [3, 4, 5], [6, 7, 8]]# 展平二维列表
flattened = [num for row in matrix_2d for num in row]
print(flattened) # [0, 1, 2, 3, 4, 5, 6, 7, 8]
6. 实际应用示例
数据清洗
# 清洗字符串列表
words = [" hello ", " WORLD", " python "]
cleaned = [word.strip().lower() for word in words]
print(cleaned) # ['hello', 'world', 'python']
文件处理
# 读取文件并处理行
# lines = [line.strip() for line in open('file.txt') if line.strip()]
复杂数据处理
# 处理嵌套数据结构
data = [{'name': 'Alice', 'scores': [85, 90, 78]},{'name': 'Bob', 'scores': [92, 88, 95]}]# 提取所有分数
all_scores = [score for student in data for score in student['scores']]
print(all_scores) # [85, 90, 78, 92, 88, 95]# 计算每个学生的平均分
averages = {student['name']: sum(student['scores'])/len(student['scores']) for student in data}
print(averages) # {'Alice': 84.333, 'Bob': 91.667}
7. 性能考虑
import time# 比较传统循环与推导式的性能
def traditional_way(n):result = []for i in range(n):if i % 2 == 0:result.append(i**2)return resultdef comprehension_way(n):return [i**2 for i in range(n) if i % 2 == 0]# 对于大数据集,推导式通常更快
n = 1000000start = time.time()
traditional_way(n)
print(f"传统方式: {time.time() - start:.4f}秒")start = time.time()
comprehension_way(n)
print(f"推导式: {time.time() - start:.4f}秒")
8. 最佳实践
- 保持简洁:如果推导式太长或太复杂,考虑使用传统循环
- 可读性优先:不要为了简洁而牺牲代码可读性
- 避免副作用:推导式主要用于数据转换,避免在其中执行复杂操作
- 考虑内存:对于大数据集,考虑使用生成器表达式
推导式是 Python 中非常强大的特性,合理使用可以让代码更加简洁、高效和易读!