#python #sudoku
Вопрос:
Я создаю код для инициализации сетки судоку, где n^2-размер доски, а альфа-процент ячеек, которые будут заполнены. Но когда я пытаюсь изменить только одну рассматриваемую ячейку, меняется целая колонка, и я не знаю, как решить
enter code here import random def inicializagrelha(n,alpha): #A grelha vai ser uma lista com listas... O numero de listas vai ser n^2 e o tamanho de cada lista é n^2 if alpha lt;= 0 or alpha gt; 1: return "Error" #O alpha tem de estar sempre entre 0 e 1 numeropreencher = 0 numeropreencher = round((n**4) * alpha) #numero de casas que tem de preencher grelha = [] listaux = [] for k in range(n * n): listaux.append(0) grelha.append(listaux) count = 0 celulaspreenchidas = [] while(count lt; 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)-auxlt;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 else: aux = random.randint(1,n**4) return grelha inicializagrelha(3,0.2)
Комментарии:
1. в вашем коде я не видел кода для обновления одного столбца?
2. Проблема в строке grelha.append(список)
3.
grelha.append(listaux)
НЕ создает новых списков; каждая добавляемая вами вещь является ссылкой на один и тот же список, поэтому ее изменения будут отражены во всех местах, где она используется.4. Предполагается, что строка и столбец будут обновляться одновременно
5. @RandomDavis большое спасибо, как мне это изменить?
Ответ №1:
Попробуйте изменить
grelha = [] listaux = [] for k in range(n * n): listaux.append(0) grelha.append(listaux)
Для
grelha = [[0 for i in range(n)] for j in range(n)]
«Но почему?» — спросите вы.
Во-первых, давайте пройдемся по тому, что происходит. При повторении цикла от k=0
до k=n-1
(давайте пока предположим n=3
, что для простоты) происходит следующее:
grelha = [] listaux = [] k = 0 listaux.append(0) -gt; now listaux = [0] grelha.append(listaux) -gt; now grelha = [[0]] k = 1 listaux.append(0) -gt; now listaux = [0, 0] grelha.append(listaux) -gt; now grelha = [[0, 0], [0, 0]]
Но подождите! Почему изменился первый grelha
элемент? Потому что, когда вы добавляете listaux
grelha
, вы на самом деле просто помещаете ссылку listaux
туда. Поэтому во 2-й итерации, когда вы меняетесь listaux
, он изменяет первый элемент grelha
. Продолжая, мы увидим, что
k = 2 listaux.append(0) -gt; now listaux = [0, 0, 0] grelha.append(listaux) -gt; now grelha = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
и это продолжается! Теперь, если мы изменимся, например, grelha[1][1] = 5
мы увидим
gt;gt;gt; grelha [[0, 5, 0], [0, 5, 0], [0, 5, 0]]
потому что каждый подсписок grelha
относится к одному и тому же списку.
Комментарии:
1. Большое спасибо, чувак, это сработало