You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无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]]:
    1. lis[i:i+2]先提取出从第i行到第i+1行的子列表(切片是左闭右开,所以i:i+2包含i和i+1两行)。
    2. 对提取出的每一行row,再做列切片row[j:j+2],拿到该行的第j到j+1列元素。
    3. 把这些行切片组合起来,就是一个完整的2×2子矩阵。

运行这段代码后,输出完全符合你的期望:

[[[1, 1], [2, 2]], [[1, 1], [2, 2]], [[2, 2], [3, 3]], [[2, 2], [3, 3]]]

内容的提问来源于stack exchange,提问作者Transwert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:48