Python 推导式详解
Python 推导式(Comprehension)是一种简洁高效的语法结构,用于快速生成列表、字典、集合等数据结构。它通过一行代码替代传统的多行循环,使代码更简洁易读。以下是常见的推导式类型及用法详解:
一、列表推导式(List Comprehension)
语法:[expression for item in iterable if condition]
作用:生成列表,可包含条件过滤和多重循环。
示例:
python"># 生成平方数列表
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]# 筛选偶数
evens = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]# 双重循环(笛卡尔积)
pairs = [(a, b) for a in [1, 2] for b in ['x', 'y']]
# 结果:[(1, 'x'), (1, 'y'), (2, 'x'), (2, 'y')]
注意:
- 可以嵌套多个
for
循环和if
条件。 - 复杂逻辑建议改用普通循环,避免降低可读性。
二、字典推导式(Dict Comprehension)
语法:{key_expr: value_expr for item in iterable if condition}
作用:快速生成字典,常用于键值对转换。
示例:
python"># 将列表转换为字典(元素作为键,平方作为值)
d = {x: x**2 for x in [1, 2, 3]} # {1: 1, 2: 4, 3: 9}# 交换键值对
original = {'a': 1, 'b': 2}
swapped = {v: k for k, v in original.items()} # {1: 'a', 2: 'b'}# 合并两个列表为字典
keys = ['name', 'age']
values = ['Alice', 30]
data = {k: v for k, v in zip(keys, values)} # {'name': 'Alice', 'age': 30}
注意:
- 键必须唯一,重复键会覆盖原有值。
三、集合推导式(Set Comprehension)
语法:{expression for item in iterable if condition}
作用:生成无序且元素唯一的集合,自动去重。
示例:
python"># 生成不重复的平方数
unique_squares = {x**2 for x in [1, -1, 2, -2]} # {1, 4}# 筛选长度大于3的字符串
words = {"apple", "bat", "cat"}
long_words = {word for word in words if len(word) > 3} # {'apple'}
四、生成器表达式(Generator Expression)
语法:(expression for item in iterable if condition)
特点:惰性计算,逐个生成元素,节省内存,适合处理大数据。
示例:
python"># 生成器逐个产生平方数
squares_gen = (x**2 for x in range(1000000))# 使用生成器求和(无需预存全部数据)
total = sum(x for x in range(10) if x % 2 == 0) # 20
注意:
- 生成器只能用一次,遍历后即耗尽。
五、嵌套推导式
推导式可以嵌套使用,处理多维数据结构。
示例:
python"># 展平二维列表
matrix = [[1, 2], [3, 4], [5, 6]]
flattened = [num for row in matrix for num in row] # [1, 2, 3, 4, 5, 6]# 转置矩阵
transposed = [[row[i] for row in matrix] for i in range(2)]
# 结果:[[1, 3, 5], [2, 4, 6]]
六、使用建议
- 简洁性:适合简单逻辑,复杂操作建议拆分为多行。
- 性能:推导式通常比普通循环快,但生成器更省内存。
- 可读性:避免多层嵌套或过多条件,确保代码易于理解。
类型 | 语法 | 输出 | 特点 |
---|---|---|---|
列表推导式 | [x for x in ...] | 列表 | 有序,可重复 |
字典推导式 | {k: v for ...} | 字典 | 键值对,键唯一 |
集合推导式 | {x for x in ...} | 集合 | 无序,元素唯一 |
生成器 | (x for x in ...) | 生成器 | 惰性计算,节省内存 |
掌握推导式可以大幅提升代码简洁性,但需根据场景权衡可读性与效率。