如何修复“列表索引必须是整数,而不是类型”

时间:2016-05-27 03:00:49

标签: python

如何修复此代码:

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

2 个答案:

答案 0 :(得分:2)

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

答案 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的解决方案之一