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

如何访问嵌套列表内的单个单元格及数独初始化整列异常修改问题

问题原因
  • 核心问题出在网格初始化的代码段,你所有行都引用了同一个列表对象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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:15:04