Python: индекс списка вне диапазона, но только иногда
Я изменяю некоторый код, который решает головоломку судоку. Я добавляю в кусок, который будет случайным образом заполнять некоторые пустые клетки случайными значениями (1-9). Он проверяет, является ли это значение допустимым (не используется в текущей строке, столбце или квадрате 3x3), и, если оно есть, заменяет пустое значение на него.
Проблема в том, что я иногда получаю "IndexError: list index вне диапазона", пока он проверяет, присутствует ли значение в текущем квадрате 3x3. Я напечатал значение и текущую ячейку и обнаружил, что проблема возникает только тогда, когда столбец является последним или вторым по последнему (столбец 7 или 8). Ниже приведен соответствующий код:
Здесь я генерирую 10 случайных значений для случайных ячеек. Затем я использую isValid, чтобы увидеть, используются ли они в текущей строке, столбце или квадрате 3x3.
for c in range(10):
e = random.randint(1,9)
print(e)
i = random.randint(0,8)
j = random.randint(0,8)
print([i],[j])
if initial_grid[i][j] == 0:
if isValid(initial_grid,i,j,e):
initial_grid[i][j] = e
Вот функция isValid. Ошибка в последнем операторе if (if initial_grid[x][y] == e:), где указано, что индекс списка находится вне диапазона.
def isValid(initial_grid, i, j, e):
rowOk = all([e != initial_grid[i][x] for x in range(9)])
if rowOk:
columnOk = all([e != initial_grid[x][j] for x in range(9)])
if columnOk:
secTopX, secTopY = int(3 *(i/3)), int(3 *(j/3))
for x in range(secTopX, secTopX+3):
for y in range(secTopY, secTopY+3):
if initial_grid[x][y] == e:
return False
return True
return False
Код работает нормально до тех пор, пока одно из случайных значений не появится в 7-м или 8-м столбце. Ошибка устраняется, если заменить secTopY+3 на secTopY+1, но тогда она не будет правильно проверять квадрат 3x3.
Я не вижу, где индекс списка находится вне диапазона. Любая помощь приветствуется.