如何访问嵌套列表内的单个单元格及数独初始化整列异常修改问题
问题原因
- 核心问题出在网格初始化的代码段,你所有行都引用了同一个列表对象
listaux:
你原来的初始化逻辑是:
listaux = [] for k in range(n * n): listaux.append(0) grelha.append(listaux)
这里你只创建了1个列表listaux,每次循环都把同一个列表的引用添加到grelha里,最终grelha里的所有行其实指向同一块内存空间,修改任意一行的某个位置,所有行的对应位置都会同步改动,表现出来就是改单个单元格整列都变。
修复方案
把网格初始化的逻辑改成每次循环都创建新的行列表即可,修正后的完整代码如下:
import random def inicializagrelha(n,alpha): # 网格为n²行n²列的二维列表 if alpha <= 0 or alpha > 1: return "Error" # alpha取值范围必须在0到1之间 numeropreencher = round((n**4) * alpha) # 需要填充的单元格总数 grelha = [] # 修正后的初始化逻辑:每次循环新建独立的行列表 for k in range(n * n): listaux = [0]*(n*n) grelha.append(listaux) count = 0 celulaspreenchidas = [] while(count < numeropreencher): aux = random.randint(1,n**4) if aux not in celulaspreenchidas: celulaspreenchidas.append(aux) linha = 0 coluna = 0 for j in range(0,n**2): if (j+1)*(n**2)-aux < n**2: linha = j if (j+1)*n**2-aux == 0: coluna = 0 coluna = (n**2)-((j+1)*n**2-aux)-1 print(linha,coluna,aux) grelha[linha][coluna] = aux count += 1 return grelha # 测试调用 inicializagrelha(3,0.2)
额外优化建议
- 你用来计算行、列索引的循环可以直接用数学运算替代,不需要遍历判断,效率更高:
linha = (aux - 1) // (n * n) coluna = (aux - 1) % (n * n)
直接替换掉原来的for j in range(0,n**2): ...那段代码即可,逻辑完全等效,运行速度更快。
内容的提问来源于stack exchange,提问作者Pestana
相关产品推荐
相关产品推荐

