如何修复"list indices must be integers, not type"



如何修复此代码:

def CheckRow(arr, row, num):
for col in range(9):
if (arr[row][col] == num):
return True
return False
TypeError: list indices must be integers, not type

rowcol不是整数,其中一个是type。检查它们,可能其中一个等于None,因为您说它是类中的函数。

def SolveSudoku(arr):
row = int
col = int
if (not FinZero(arr, row, col)):
return True
for num in range(1,10):
if (IsSafe(arr, row, col, num)):
arr[row][col] = num
if (SolveSudoku(arr)):
return True
arr[row][col] = 0
return False

在本部分中,您可以看到row = int。这是我见过的最糟糕的定义,可能是代码作者试图定义一个空整数。基本上将其更改为row = int()

检查此

row = int
row_int = int()
print (type(row))
print (type(row_int))

输出;

>>> 
<class 'type'>
<class 'int'>
>>> 

第一个是type,第二个是integer

错误不在于代码,而在于输入。

很可能您传递的参数row不是整数。

你的代码也应该这样格式化:

def CheckRow(arr, row, num):
for col in range(9):
if (arr[row][col] == num):
return True
return False

编辑

我查看了你在GLHF的帖子中链接的代码。

转换问题

这是我的版本,在C++代码中保留所有的命名约定。

UNASSIGNED = 0
N = 9
def FindUnassignedLocation(grid, row, col):
for row in range(N):
for col in range(N):
if grid[row][col] == UNASSIGNED:
return True
return False
def UsedInRow(grid, row, num):
for col in range(N):
if grid[row][col] == num:
return True
return False
def UsedInCol(grid, col, num):
for row in range(N):
if grid[row][col] == num:
return True
return False
def UsedInBox(grid, boxStartRow, boxStartCol, num):
for row in range(3):
for col in range(3):
if grid[row + boxStartRow][col + boxStartCol] == num:
return True
return False
def isSafe(grid, row, col, num):
return False not in (UsedInRow(grid, row, num),
UsedInCol(grid, col, num),
UsedInBox(grid, row - (row % 3), col - (col % 3), num)):
def printGrid(grid):
for row in range(N):
for col in range(N):
print "%2d" % (grid[row][col])
def SolveSodoku(grid):
row = 0
col = 0
if not FinZero(grid, row, col):
return True
for num in range(1,10):
if isSafe(grid, row, col, num):
grid[row][col] = num
if SolveSodoku(grid):
return True
else:
grid[row][col] = UNASSIGNED
return False
grid = [
[ 3, 0, 0, 0, 0, 0, 5, 0, 0 ],
[ 0, 0, 0, 8, 0, 6, 0, 0, 0 ],
[ 0, 2, 5, 0, 0, 0, 6, 0, 1 ],
[ 7, 0, 9, 0, 3, 8, 0, 0, 4 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 1, 0, 0, 9, 4, 0, 3, 0, 6 ],
[ 8, 0, 3, 0, 0, 0, 7, 6, 0 ],
[ 0, 0, 0, 3, 0, 4, 0, 0, 0 ],
[ 0, 0, 1, 0, 0, 0, 0, 0, 9 ]
]
if SolveSodoku(grid):
printGrid(grid)
else:
print "No solution exists"

您遇到的问题是,当从C++转换为Python时,C++中的语句

int row, col;

将实际实例化默认值为0的变量。因此,它相当于Python的

row = 0
col = 0

最大递归深度

这个问题应该会在这个帖子中得到解决。

是的,这是一种防止堆栈溢出的措施。

您可以使用sys.setrecursionlimit更改递归限制,但这样做是危险的——标准限制有点保守,但Python堆栈框架可能相当大。

然而,当你增加最大递归深度时,它确实警告说它可能会使Python崩溃(就像它在我的计算机上所做的那样),我建议你在这里看看解决递归数独的解决方案之一。

相关内容

最新更新