python教程:python中的列表推导式及其案例

列表推导式(List Comprehension)是 Python 中的一种简洁表达方式,用于生成列表。它可以使用简短的语法将循环和条件逻辑结合在一起,方便地创建新的列表。

列表推导的基本语法

[expression for item in iterable if condition]
  • expression:每个元素在列表中的表达式,表示如何生成元素。
  • item:从可迭代对象(如列表、元组、字符串等)中获取的元素。
  • iterable:可迭代对象,源数据。
  • if condition:可选,用于过滤,只保留满足条件的元素。

示例 1:基本的列表推导

将一个列表中的每个元素进行平方操作并生成一个新列表。

# 使用列表推导式生成平方数列表
numbers = [1, 2, 3, 4, 5]
squares = [x ** 2 for x in numbers]
print(squares)  # 输出:[1, 4, 9, 16, 25]

解释

  • x ** 2 是要执行的表达式,计算每个元素的平方。
  • for x in numbers 遍历 numbers 列表中的每个元素。

示例 2:带条件的列表推导

只保留列表中的偶数,并将它们平方后生成新列表。

# 只对偶数进行平方
numbers = [1, 2, 3, 4, 5, 6]
even_squares = [x ** 2 for x in numbers if x % 2 == 0]
print(even_squares)  # 输出:[4, 16, 36]

解释

  • if x % 2 == 0 过滤掉所有奇数,只保留偶数。

示例 3:嵌套的列表推导

列表推导也可以嵌套使用,类似于嵌套循环。例如,生成一个 3x3 的二维列表。

# 生成一个 3x3 的矩阵
matrix = [[j for j in range(3)] for i in range(3)]
print(matrix)
# 输出:[[0, 1, 2], [0, 1, 2], [0, 1, 2]]

解释

  • 外层的 [for i in range(3)] 控制生成 3 个列表。
  • 内层的 [for j in range(3)] 控制每个子列表中有 3 个元素。

示例 4:生成一个笛卡尔积

使用列表推导生成两个列表的笛卡尔积。

# 笛卡尔积:生成 (x, y) 对,其中 x 来自 list1,y 来自 list2
list1 = [1, 2, 3]
list2 = ['a', 'b']
cartesian_product = [(x, y) for x in list1 for y in list2]
print(cartesian_product)
# 输出:[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]

解释

  • for x in list1 遍历第一个列表,for y in list2 遍历第二个列表,生成每个可能的 (x, y) 对。

示例 5:列表推导与函数结合

列表推导可以与函数结合使用,将列表中的每个元素通过函数处理后生成新列表。

# 定义一个函数,用于计算数值的平方
def square(x):
    return x ** 2

# 使用列表推导结合函数
numbers = [1, 2, 3, 4, 5]
squares = [square(x) for x in numbers]
print(squares)  # 输出:[1, 4, 9, 16, 25]

解释

  • 列表推导式 [square(x) for x in numbers] 调用了 square() 函数,对 numbers 中的每个元素执行平方操作。

示例 6:字典推导和集合推导

除了列表推导,Python 还支持字典推导集合推导,它们的语法与列表推导类似。

字典推导

将一个列表中的元素映射为键值对生成字典。

# 使用字典推导创建一个字典,键为数字,值为数字的平方
numbers = [1, 2, 3, 4, 5]
square_dict = {
    
    x: x ** 2 for x in numbers}
print(square_dict)  # 输出:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
集合推导

生成一个不重复的平方数集合。

# 使用集合推导生成平方数的集合
numbers = [1, 2, 3, 2, 1, 4, 5]
square_set = {
    
    x ** 2 for x in numbers}
print(square_set)  # 输出:{1, 4, 9, 16, 25}

示例 7:处理字符串

使用列表推导对字符串进行处理,生成列表。

# 将字符串中每个字符的大写形式生成一个列表
text = "hello"
uppercase_letters = [char.upper() for char in text]
print(uppercase_letters)  # 输出:['H', 'E', 'L', 'L', 'O']

解释

  • 列表推导 char.upper() for char in text 将字符串 text 中的每个字符转换为大写。

示例 8:嵌套列表推导实现转置矩阵

通过嵌套的列表推导,可以实现矩阵的转置。

# 生成一个 3x2 的矩阵
matrix = [
    [1, 2],
    [3, 4],
    [5, 6]
]

# 使用嵌套列表推导进行矩阵转置
transpose = [[row[i] for row in matrix] for i in range(2)]
print(transpose)
# 输出:[[1, 3, 5], [2, 4, 6]]

解释

  • 外层的 for i in range(2) 控制列的索引,内层的 for row in matrix 控制行的索引,从而实现矩阵转置。

列表推导的性能与可读性

  • 性能:列表推导在性能上通常优于传统的 for 循环,因为它是用 C 语言实现的,直接生成列表,不需要调用 append() 等方法。
  • 可读性:虽然列表推导简洁,但如果逻辑过于复杂(如嵌套过多、条件判断复杂),可能会影响代码的可读性。在这种情况下,使用普通循环结构可能更加合适。

总结

  • 列表推导式 是一种简洁的语法,用于基于现有的可迭代对象生成新列表。
  • 它将循环和条件语句结合在一起,可以快速、简洁地生成列表、字典和集合。
  • 常见应用场景包括数据的转换、过滤、嵌套结构的操作等。

列表推导式是 Python 的强大特性之一,它能够简化代码,使代码更加直观和简洁,但在处理复杂逻辑时应注意可读性。

猜你喜欢

转载自blog.csdn.net/sunyuhua_keyboard/article/details/142981859