Как получить доступ только к одной ячейке из списка внутри списка

#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. Большое спасибо, чувак, это сработало