列表推导式(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, 2
。len(matrix[0])
是矩阵列的数量。
内层列表推导式
内层列表推导式 [row[i] for row in matrix]
用于生成转置矩阵的单行:
row[i]
访问矩阵每一行的第i
列元素。for row in matrix
遍历矩阵的每一行。
具体过程
当
i = 0
时:内层列表推导式
[row[0] for row in matrix]
遍历矩阵的每一行,取出第0
列的元素:matrix[0][0]
是1
matrix[1][0]
是4
matrix[2][0]
是7
生成
[1, 4, 7]
,作为转置矩阵的第一行。
当
i = 1
时:内层列表推导式
[row[1] for row in matrix]
遍历矩阵的每一行,取出第1
列的元素:matrix[0][1]
是2
matrix[1][1]
是5
matrix[2][1]
是8
生成
[2, 5, 8]
,作为转置矩阵的第二行。
当
i = 2
时:内层列表推导式
[row[2] for row in matrix]
遍历矩阵的每一行,取出第2
列的元素:matrix[0][2]
是3
matrix[1][2]
是6
matrix[2][2]
是9
生成
[3, 6, 9]
,作为转置矩阵的第三行。