pin_drop当前位置:知识文库 ❯ 图文
Python列表嵌套
概述
列表嵌套是指列表中的元素也是列表,形成多维数据结构。最常见的是二维列表(矩阵),它在数据处理、游戏开发和科学计算中广泛使用。掌握嵌套列表的创建、访问和遍历,是处理复杂数据结构的基础。
二维列表创建
直接创建
代码示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix)输出:
代码示例
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]使用列表推导式创建
代码示例
matrix = [[i * 3 + j + 1 for j in range(3)] for i in range(3)]
print(matrix)输出:
代码示例
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]创建零矩阵
代码示例
rows, cols = 3, 4
zero_matrix = [[0] * cols for _ in range(rows)]
print(zero_matrix)输出:
代码示例
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]警告:常见陷阱:不要使用
[[0] * cols] * rows创建矩阵,这会导致所有行引用同一个列表对象。
代码示例
wrong = [[0] * 3] * 3
wrong[0][0] = 1
print(wrong)输出:
代码示例
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]提示:修改一行会影响所有行!因为所有行是同一个列表的引用。
访问嵌套元素
通过索引访问
代码示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[0][1])
print(matrix[2][0])输出:
代码示例
2
7修改嵌套元素
代码示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
matrix[1][2] = 99
print(matrix)输出:
代码示例
[[1, 2, 3], [4, 5, 99], [7, 8, 9]]遍历嵌套列表
使用嵌套 for 循环
代码示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
for row in matrix:
for element in row:
print(element, end=" ")
print()输出:
代码示例
1 2 3
4 5 6
7 8 9 使用索引遍历
代码示例
for i in range(len(matrix)):
for j in range(len(matrix[i])):
print(f"matrix[{i}][{j}] = {matrix[i][j]}")使用 enumerate 遍历
代码示例
for i, row in enumerate(matrix):
for j, val in enumerate(row):
print(f"[{i}][{j}] = {val}")矩阵操作
矩阵转置
代码示例
matrix = [
[1, 2, 3],
[4, 5, 6]
]
transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
print(transposed)输出:
代码示例
[[1, 4], [2, 5], [3, 6]]矩阵加法
代码示例
a = [[1, 2], [3, 4]]
b = [[5, 6], [7, 8]]
result = [[a[i][j] + b[i][j] for j in range(len(a[0]))] for i in range(len(a))]
print(result)输出:
代码示例
[[6, 8], [10, 12]]按列提取
代码示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
col_1 = [row[1] for row in matrix]
print(col_1)输出:
代码示例
[2, 5, 8]注意事项
警告:避免
*创建嵌套列表:[[0]*n]*m会导致所有行共享同一列表,修改一行会影响所有行。
警告:不规则嵌套:Python 允许每行长度不同的"锯齿"列表,遍历时需注意。
警告:深拷贝:复制嵌套列表应使用
copy.deepcopy(),浅拷贝会导致内部列表共享。
小结
嵌套列表是列表中的元素也是列表,最常见的是二维矩阵
创建矩阵应使用列表推导式,避免
*运算符的引用陷阱通过
matrix[i][j]访问元素,嵌套 for 循环遍历矩阵转置、加法等操作可用推导式简洁实现
练习题
练习1
编写一个函数 create_identity(n),创建一个 n×n 的单位矩阵(对角线为1,其余为0),使用列表推导式实现。
练习2
给定矩阵 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],编写代码计算每行的和以及每列的和,分别存储在两个列表中。
常见问题
为什么不能用 [[0]*n]*m 创建二维矩阵?
因为 * 运算符会创建多个指向同一列表对象的引用,修改其中一行会影响所有行。正确做法是使用列表推导式 [[0]*n for _ in range(m)]。
如何复制一个嵌套列表?
复制嵌套列表应使用 copy.deepcopy() 进行深拷贝,浅拷贝会导致内部列表仍然共享,修改一个副本会影响原始数据。
Python 支持不规则嵌套列表吗?
支持。Python 允许每行长度不同的"锯齿"列表,例如 [[1, 2], [3, 4, 5], [6]]。遍历时需注意每行长度可能不同,建议使用 for row in matrix: for item in row 的方式遍历。
本文涉及AI创作
内容由AI创作,请仔细甄别