如何修复此代码:
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
答案 0 :(得分:2)
row
或col
不是整数,其中一个是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
。
答案 1 :(得分:1)
错误不是代码,而是输入。
您最有可能将参数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
这个问题可以在this post中解决。
它可以防止堆栈溢出,是的。
您可以使用
sys.setrecursionlimit
更改递归限制,但这样做很危险 - 标准限制有点保守,但Python堆栈框架可能非常大。
然而,当你增加最大递归深度时,它确实警告它可能会崩溃Python(它在我的计算机上做了),我建议你看一下解决递归sodoku here的解决方案之一