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
相关产品推荐
相关产品推荐

