无Numpy实现3×3二维列表切片生成4个2×2子列表报错排查
解决Python原生二维列表切片报错:TypeError: list indices must be integers or slices, not tuple
嘿,这个错误很好理解——你写的lis[i:i+2,j:j+2]是Numpy数组的多维索引语法,但Python原生的二维列表根本不吃这一套!原生列表只能用单个索引(比如lis[0]取第一行)或者单层切片(lis[0:2]取前两行),用逗号传个元组当索引肯定会报错。
下面是修正后的代码,完全不用第三方库,能精准得到你要的4个2×2子列表:
lis = [[1,1,1],[2,2,2],[3,3,3]] print("原列表:", lis) result = [] # 遍历所有2×2子矩阵的左上角起始坐标(行和列都只能是0或1) for i in range(2): for j in range(2): # 先切出行范围,再对每一行切出列范围 sub_matrix = [row[j:j+2] for row in lis[i:i+2]] result.append(sub_matrix) print("生成的4个2×2子列表:", result)
代码逻辑拆解:
- 对于3×3的列表,要生成2×2的子列表,起始行只能是0和1(因为从行0开始取2行是0-1,行1开始取2行是1-2,刚好覆盖所有可能),起始列同理也是0和1,所以用两层
range(2)循环遍历所有4种起始位置。 - 核心的列表推导式
[row[j:j+2] for row in lis[i:i+2]]:lis[i:i+2]先提取出从第i行到第i+1行的子列表(切片是左闭右开,所以i:i+2包含i和i+1两行)。- 对提取出的每一行
row,再做列切片row[j:j+2],拿到该行的第j到j+1列元素。 - 把这些行切片组合起来,就是一个完整的2×2子矩阵。
运行这段代码后,输出完全符合你的期望:
[[[1, 1], [2, 2]], [[1, 1], [2, 2]], [[2, 2], [3, 3]], [[2, 2], [3, 3]]]
内容的提问来源于stack exchange,提问作者Transwert
相关产品推荐
相关产品推荐

