列表推导式(List Comprehension)是Python中的一种简洁语法,用于从现有列表或其他可迭代对象创建新列表。它通过在一个表达式中包含一个for循环和一个可选的if条件。

基本语法

[表达式 for 变量 in 可迭代对象 if 条件]
  • 表达式:生成列表元素的表达式,可以是对变量的操作。

  • 变量:在循环中用来表示每个元素的变量。

  • 可迭代对象:任何可以迭代的对象,如列表、字符串、元组、集合等。

  • 条件(可选):筛选元素的条件,只有满足条件的元素才会包含在生成的列表中。

示例

基本列表推导式

numbers = [1, 2, 3, 4, 5]
squares = [n**2 for n in numbers]
print(squares)  # 输出: [1, 4, 9, 16, 25]

带条件的列表推导式

numbers = [1, 2, 3, 4, 5]
even_squares = [n**2 for n in numbers if n % 2 == 0]
print(even_squares)  # 输出: [4, 16]

多个for循环的列表推导式:

创建一个包含两个列表中元素对的笛卡尔积:

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
cartesian_product = [(x, y) for x in list1 for y in list2]
print(cartesian_product)  
# 输出: [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]

复杂示例

假设我们有一个二维列表(矩阵),我们想要将其转置:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
print(transposed)  # 输出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

使用了嵌套的列表推导式来实现矩阵的转置操作。

逐步分析

外层列表推导式

外层列表推导式 [... for i in range(len(matrix[0]))] 用于生成转置矩阵的每一行:

  • range(len(matrix[0])) 产生列索引,即 i 将遍历 0, 1, 2len(matrix[0]) 是矩阵列的数量。

内层列表推导式

内层列表推导式 [row[i] for row in matrix] 用于生成转置矩阵的单行:

  • row[i] 访问矩阵每一行的第 i 列元素。

  • for row in matrix 遍历矩阵的每一行。

具体过程

  1. i = 0 时:

    • 内层列表推导式 [row[0] for row in matrix] 遍历矩阵的每一行,取出第 0 列的元素:

      • matrix[0][0]1

      • matrix[1][0]4

      • matrix[2][0]7

    • 生成 [1, 4, 7],作为转置矩阵的第一行。

  2. i = 1 时:

    • 内层列表推导式 [row[1] for row in matrix] 遍历矩阵的每一行,取出第 1 列的元素:

      • matrix[0][1]2

      • matrix[1][1]5

      • matrix[2][1]8

    • 生成 [2, 5, 8],作为转置矩阵的第二行。

  3. i = 2 时:

    • 内层列表推导式 [row[2] for row in matrix] 遍历矩阵的每一行,取出第 2 列的元素:

      • matrix[0][2]3

      • matrix[1][2]6

      • matrix[2][2]9

    • 生成 [3, 6, 9],作为转置矩阵的第三行。