Python 中二维列表(list)(嵌套列表)详解

包括:

  • 二维列表的定义与初始化
  • 遍历、索引、切片
  • 增删改查
  • 推导式操作
  • 注意事项
  • 与 NumPy 的对比(性能 + 语法)

一、二维列表简介与定义

定义方式 1:直接嵌套列表

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

定义方式 2:列表推导式初始化

# 创建一个 3x4 的全零矩阵
rows, cols = 3, 4
matrix = [[0 for _ in range(cols)] for _ in range(rows)]

二、二维列表的访问与遍历

1. 单个元素访问

matrix[0][1]  # 访问第 0 行第 1 列元素(值为 2)

2. 遍历方式

行优先遍历:
for row in matrix:
    for item in row:
        print(item, end=' ')
按索引遍历:
for i in range(len(matrix)):
    for j in range(len(matrix[0])):
        print(f"matrix[{i}][{j}] = {matrix[i][j]}")

三、修改、添加、删除操作

1. 修改元素

matrix[1][2] = 99

2. 增加一行或一列

# 添加一行
matrix.append([10, 11, 12])

# 添加一列(给每行增加一个元素)
for row in matrix:
    row.append(0)

3. 删除行或列

# 删除第 2 行
del matrix[2]

# 删除第 1 列(遍历每一行)
for row in matrix:
    del row[1]

四、二维列表推导式

示例:创建 5x5 的乘法表

table = [[i * j for j in range(1, 6)] for i in range(1, 6)]

五、常见二维操作函数

1. 转置矩阵

transposed = [list(col) for col in zip(*matrix)]

2. 按列遍历

for col in zip(*matrix):
    print(col)

六、注意事项与误区

误区:初始化二维列表时不要使用 *

wrong = [[0]*4]*3
wrong[0][0] = 1
print(wrong)
# [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]] ❌ 所有行是同一引用

# 正确做法:
correct = [[0 for _ in range(4)] for _ in range(3)]

七、二维列表与 NumPy 的对比

操作Python 列表NumPy 数组
定义[[1,2],[3,4]]np.array([[1,2],[3,4]])
取值a[i][j]a[i, j] ✅更快
转置zip(*a)a.T
切片复杂简洁如 a[:, 1]
运算不支持矩阵运算支持如 a + b, a @ b
性能较慢快得多(C实现)

NumPy 示例:

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = a.T           # 转置
c = a + b         # 矩阵加法
d = a @ b         # 矩阵乘法
print(c)

八、应用场景小例子

1. 图像处理:灰度图矩阵表示

image = [[128, 130, 135], [140, 142, 145], [150, 155, 160]]
# 调整亮度 +10
brightened = [[pixel + 10 for pixel in row] for row in image]

2. BFS/DFS 中的地图矩阵

# 地图 0 表示可走,1 表示障碍
grid = [
    [0, 1, 0],
    [0, 0, 0],
    [1, 0, 1]
]

九、小结表

操作示例
定义二维列表[[0]*cols for _ in range(rows)]
添加行matrix.append([...])
添加列for row in matrix: row.append(x)
删除行del matrix[i]
删除列for row in matrix: del row[j]
推导式构建[[i*j for j in ...] for i in ...]
转置[list(col) for col in zip(*m)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值