推导式详解

推导式详解

推导式(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 编程更加高效和简洁。

posted @   猪油哥  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示