Python 推导式详解

Python 推导式详解

Python 推导式(Comprehension)是一种简洁高效的语法结构,用于快速生成列表、字典、集合等数据结构。它通过一行代码替代传统的多行循环,使代码更简洁易读。以下是常见的推导式类型及用法详解:

一、列表推导式(List Comprehension)

语法[expression for item in iterable if condition]

作用:生成列表,可包含条件过滤和多重循环。

示例

# 生成平方数列表
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}

作用:快速生成字典,常用于键值对转换。

示例

# 将列表转换为字典(元素作为键,平方作为值)
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}

作用:生成无序且元素唯一的集合,自动去重。

示例

# 生成不重复的平方数
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)

特点:惰性计算,逐个生成元素,节省内存,适合处理大数据。

示例

# 生成器逐个产生平方数
squares_gen = (x**2 for x in range(1000000))

# 使用生成器求和(无需预存全部数据)
total = sum(x for x in range(10) if x % 2 == 0)  # 20

注意

  • 生成器只能用一次,遍历后即耗尽。

五、嵌套推导式

推导式可以嵌套使用,处理多维数据结构。

示例

# 展平二维列表
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 ...)生成器惰性计算,节省内存

掌握推导式可以大幅提升代码简洁性,但需根据场景权衡可读性与效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值