推导式详解
推导式详解
推导式(Comprehension)是 Python 中的一种简洁而强大的构造,用于从现有的可迭代对象生成新的可迭代对象。Python 提供了几种不同类型的推导式,包括列表推导式、字典推导式、集合推导式和生成器推导式。下面我们将逐一介绍这些推导式的用法和特点。
1. 列表推导式
列表推导式用于创建一个新的列表,其语法如下:
[expression for item in iterable if condition]
- expression: 用于生成新列表元素的表达式。
- item: 当前迭代的元素。
- iterable: 任何可迭代对象(如列表、元组、字符串等)。
- condition: 可选的过滤条件,只有在条件为真时,元素才会被包含在新列表中。
示例1
# 创建一个包含平方数的列表
squares = [x**2 for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 创建一个包含偶数的列表
even_numbers = [x for x in range(20) if x % 2 == 0]
print(even_numbers) # 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
示例2
"""
列表推导式的语法格式如下:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
或者
[表达式 for 迭代变量1 in 可迭代对象1 [if 条件表达式] for 迭代变量2 in 可迭代对象2 [if 条件表达式]]
或者
[表达式 for 迭代变量 in 可迭代对象 for 迭代变量2 in 可迭代对象2 [if 条件表达式] ]
"""
a_rang = range(1, 11)
b_rang = range(11, 21)
# 找出两个区间数据的偶数,并把这些偶数组成元组的元素
# 推导式内有两个for,就相当于两个for循环嵌套
li = [(a, b) for a in a_rang if a % 2 == 0 for b in b_rang if b % 2 == 0]
print(li)
"""
上述代码拆分如下:
li = []
for a in range(1, 11):
if a % 2 == 0:
for b in range(11, 21):
if b % 2 == 0:
li.append((a, b))
print(li)
输出结果:
[(2, 12), (2, 14), (2, 16), (2, 18), (2, 20), (4, 12), (4, 14), (4, 16), (4, 18), (4, 20), (6, 12), (6, 14), (6, 16), (6, 18), (6, 20), (8, 12), (8, 14), (8, 16), (8, 18), (8, 20), (10, 12), (10, 14), (10, 16), (10, 18), (10, 20)]
"""
li = [a * b for a in a_rang for b in b_rang if b % a == 0]
print(li)
"""
上述代码拆分如下:
li = []
for a in range(1, 11):
for b in range(11, 21):
if b % a == 0:
li.append(a * b)
print(li)
输出结果:[11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 24, 28, 32, 36, 40, 36, 45, 54, 48, 64, 80, 75, 100, 72, 108, 98, 128, 162, 200]
"""
# 结论:推导式思维步骤:
# 1、先使用变量i遍历可迭代对象。
# 2、对这个变量i进行判断操作。
# 3、把这个经过判断筛选的变量i放到新列表的最前面,可以对这个最前面的i进行其他操作组成新的列表元素,或者不进行任何操作,就把这个i当前新的元素
# 当然,也支持类似于三层嵌套的 for 表达式,例如如下代码:
e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)]
# e_list列表包含120个元素
print(e_list)
# 需求:程序要将两个列表中的数值按“能否整除”的关系配对在一起。
# 比如src_a列表中包含30,src_b列表中包含5,其中30可以整除5,那么就将30和5配对在一起。
# 对于上面的需求使用for 表达式来实现非常简单,例如如下代码:
src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121]
src_b = [3, 5, 7, 11]
# 只要x能整除y,就将它们配对在一起
result = [(x, y) for x in src_a for y in src_b if x % y == 0]
print(result)
# 输出结果:[(30, 3), (30, 5), (12, 3), (66, 3), (66, 11), (39, 3), (78, 3), (36, 3), (57, 3), (121, 11)]
2. 字典推导式
字典推导式用于创建一个新的字典,其语法如下:
{key_expression: value_expression for item in iterable if condition}
- key_expression: 用于生成字典键的表达式。
- value_expression: 用于生成字典值的表达式。
示例1
# 创建一个字典,其中键是数字,值是它们的平方
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 创建一个字典,过滤掉奇数
even_squares_dict = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares_dict) # 输出: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
示例2
"""
Python 中,使用字典推导式可以借助列表、元组、字典、集合以及 range 区间,快速生成符合需求的字典。
字典推导式的语法格式如下:
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}
"""
list_demo = ['Jack', 'Tom']
# 将列表中各字符串值为键,各字符串的长度为值,组成键值对
new_dict = {key: len(key) for key in list_demo}
print(new_dict) # 输出结果:{'Jack': 4, 'Tom': 3}
# 交换现有字典中各键值对的键和值
old_dict = {'Jack': 4, 'Tom': 3}
new_dict = {v: k for k, v in old_dict.items()} # 遍历字典要使用items()函数
print(new_dict)
# 使用 if 表达式筛选符合条件的键值对。
old_dict = {4: 'Jack', 3: 'Tom', 5: 10}
new_dict = {k: v for k, v in old_dict.items() if k > 3 and isinstance(v, str)}
print(new_dict)
3. 集合推导式
集合推导式用于创建一个新的集合,其语法与列表推导式相似:
{expression for item in iterable if condition}
示例1
# 创建一个集合,包含0到9的平方
squares_set = {x**2 for x in range(10)}
print(squares_set) # 输出: {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
# 创建一个集合,过滤掉重复的偶数
unique_even_numbers = {x for x in range(20) if x % 2 == 0}
print(unique_even_numbers) # 输出: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
示例2
# 集合推导式与列表推导式完全一致,不一样的是列表是用[]号括起来,集合是用{}号括起来,
# 集合保存的元素必须是唯一的
list_demo = {2, 2, 3, 4, 5, 6, 6}
new_set = {i for i in list_demo if i % 2 == 0} # 会过滤掉重复的,因为集合的唯一的
print(new_set)
src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121, 30]
src_b = [3, 5, 7, 11]
new_set = {(a, b) for a in src_a for b in src_b if a % b == 0}
new_tu = tuple((a, b) for a in src_a for b in src_b if a % b == 0)
print(new_set)
print(new_tu)
4. 生成器推导式
生成器推导式类似于列表推导式,但它返回一个生成器对象,而不是一个完整的列表。其语法如下:
(expression for item in iterable if condition)
生成器推导式的结果是一个惰性计算的迭代器,可以逐个生成值,而不需要一次性生成所有值,这在处理大数据时非常有用。
示例
# 创建一个生成器,生成0到9的平方
squares_gen = (x**2 for x in range(10))
# 使用生成器
for square in squares_gen:
print(square) # 输出: 0, 1, 4, 9, 16, 25, 36, 49, 64, 81
5. 元组推导式
通过和列表推导式做对比,你会发现,除了元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是 [],其它完全相同。不仅如此,元组推导式和列表推导式的用法也完全相同。
# 通过和列表推导式做对比,你会发现,除了元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是 [],其它完全相同。不仅如此,元组推导式和列表推导式的用法也完全相同。
src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121]
src_b = [3, 5, 7, 11]
tu = tuple((a, b) for a in src_a for b in src_b if a % b == 0) # 元组推导式要使用tuple() 函数,可以直接将生成器对象转换成元组
print(tu)
tu = ((a, b) for a in src_a for b in src_b if a % b == 0) # 没有tuple函数,生成的是一个可迭代对象
print(tu)
for x in tu:
print(x)
l1 = [2, 4, 6, 8, 9]
tu = tuple(i * 100 for i in l1 if i % 2 == 0)
print(tu)
6. 嵌套推导式
推导式可以嵌套使用,尤其在处理多维数据结构时非常方便。
示例
# 创建一个二维列表(矩阵)的转置
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transpose = [[row[i] for row in matrix] for i in range(3)]
print(transpose) # 输出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
总结
推导式是一种优雅且简洁的语法,能够在 Python 中以更少的代码实现相同的功能。它们不仅提高了代码的可读性,还可以在某些情况下优化性能(如生成器推导式)。理解并灵活运用推导式,可以让你的 Python 编程更加高效和简洁。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?