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

Python 拆分9x9嵌套列表为3x3区块存储为字典的实现与调试

数独3x3区块分块存储实现

需求说明

给定9x9嵌套列表结构的数独棋盘,需要将棋盘划分为9个大小为3x3的独立区块,将每个区块包含的所有元素按行顺序合并为长度为9的列表,存入以1-9为键的字典中,最终字典共包含9个键,每个键对应的值长度固定为9。

原始棋盘数据:

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

预期输出结构示例:

# 左上角第一块
dd = {1: [5, 3, 0, 6, 0, 0, 0, 9, 8]}
# 上排中间块
dd = {2: [0, 7, 0, 1, 9, 5, 0, 0, 0]}

原有代码的问题

上述尝试的实现逻辑无法达成预期效果,核心缺陷如下:

  • 遍历每一行时直接对字典的键执行赋值操作,会覆盖之前已存入的同键内容,无法实现跨3行、跨3列的区块元素累加
  • 列偏移计数器没有按每3行重置的逻辑,遍历完第一行后列截取范围就会超出9列的边界,最终会截取到空值
  • 区块编号的重置逻辑错误,没有按每3行重置一次列偏移和区块编号,会导致字典的键数量超出9个,编号错乱

可运行的实现方案

按照数独区块的通用划分规则:

  • 行方向每连续3行划分为一个区块行组,共3组(索引0-2、3-5、6-8)
  • 列方向每连续3列划分为一个区块列组,共3组(索引0-2、3-5、6-8)
  • 区块编号按从上到下、从左到右的顺序从1递增,第一行组的3个区块编号为1、2、3,第二行组为4、5、6,第三行组为7、8、9

完整实现代码:

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

# 初始化字典,每个键对应空列表,逐次累加元素
block_dict = {block_id: [] for block_id in range(1, 10)}

# 逐行组处理,每3行作为一个处理单元
for row_group_start in (0, 3, 6):
    # 当前行组对应的三个区块编号
    row_group_offset = row_group_start // 3
    current_block_ids = [
        row_group_offset * 3 + 1,
        row_group_offset * 3 + 2,
        row_group_offset * 3 + 3
    ]
    # 遍历当前行组内的每一行
    for row_idx in range(row_group_start, row_group_start + 3):
        row_content = board[row_idx]
        # 将当前行按列拆分为3个片段,分别追加到对应区块的列表中
        block_dict[current_block_ids[0]].extend(row_content[0:3])
        block_dict[current_block_ids[1]].extend(row_content[3:6])
        block_dict[current_block_ids[2]].extend(row_content[6:9])

print(block_dict)

运行验证:

  • block_dict[1]的返回值为[5, 3, 0, 6, 0, 0, 0, 9, 8],与预期第一区块的结果完全一致
  • block_dict[2]的返回值为[0, 7, 0, 1, 9, 5, 0, 0, 0],与预期第二区块的结果完全一致
  • 所有键对应的列表长度均为9,无空值、无越界截取问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 20:15:06