Python实现:将无分隔符数字字符串转换为9x9二维列表
无分隔符数字字符串转9x9数独二维列表的解决方案
你的代码问题出在哪
- 两种写法都没预先创建9x9的空二维列表,直接访问
list1[i][j]必然触发索引越界——空列表里根本不存在这些位置。 - 三层循环逻辑完全混乱:你反复把整个字符串的所有字符往每个格子里塞,这完全不是按顺序填充数独的正确逻辑。
正确的实现方式
方式1:嵌套循环(新手友好,逻辑清晰)
先初始化一个9行9列的二维列表,再按顺序遍历字符串的每个字符,计算对应的行和列索引填充进去:
numbers = '084030001560014000001586704420001070005309802900200043100078005006105407000490000' # 先创建9x9的空二维列表,初始值设为0 sudoku = [[0 for _ in range(9)] for _ in range(9)] for idx in range(len(numbers)): row = idx // 9 # 每9个字符占一行,整除9得到行号 col = idx % 9 # 取余9得到当前行的列号 sudoku[row][col] = int(numbers[idx]) print(sudoku)
方式2:列表推导式(简洁高效,Python风格)
用切片把字符串分成9段(每段9个字符),再将每个字符转为整数:
numbers = '084030001560014000001586704420001070005309802900200043100078005006105407000490000' # 写法1:按索引计算每个位置 sudoku = [[int(numbers[i*9 + j]) for j in range(9)] for i in range(9)] # 写法2:直接切片取每行,更直观 sudoku = [[int(c) for c in numbers[i*9 : (i+1)*9]] for i in range(9)]
方式3:分步拆解(适合理解过程)
如果觉得列表推导式太紧凑,分步操作更清晰:
numbers = '084030001560014000001586704420001070005309802900200043100078005006105407000490000' sudoku = [] for i in range(9): # 从字符串中截取第i行的9个字符 row_chars = numbers[i*9 : (i+1)*9] # 把每个字符转成整数,组成一行的列表 row = [int(char) for char in row_chars] # 将该行加入数独列表 sudoku.append(row)
结果验证
以上三种方法都会生成标准的9x9二维列表,每个元素对应数独的一个格子(0代表空白),完全满足数独求解器的后续开发需求。
内容的提问来源于stack exchange,提问作者Viper75
相关产品推荐
相关产品推荐

