Python 构建二维数组获取列表分配索引超出范围

Python building 2d array getting list assignment index out of range

N = len(s1)
M = len(s2)
matrix = [[0 for i in range(N+1)] for j in range(M+1)]
gap = int(raw_input('Enter gap score'))
mismatch = int(raw_input('Enter mismatch score'))
match = int(raw_input('Enter the match score'))

matrix[0][0] = 0

for i in range(1,(N+1)):
    matrix[i][0]=(matrix[(i-1)][0] + gap)

for j in range(1,(M+1)):
    matrix[0][j]=(matrix[0][(j-1)] + gap)  

for i in range(1,N+1):
    for j in range(1,M+1):
        if(s1[i-1] == s2[j-1]):
            score1 = matrix[i-1][j-1] + match

        else:
            score1 = matrix[i-1][j-1] + mismatch

        score2 = matrix[i][j-1] + gap
        score3 = matrix[i-1][j] + gap
        matrix[i][j] = max(score1, score2, score3)

我得到了错误代码 追溯(最近一次通话): 文件 "C:\Users\Matt\workspace\ch3skills\ch3skills.py",第 67 行,位于 矩阵[0][j]=(矩阵[0][(j-1)] + 间隙)
IndexError: 列表赋值索引超出范围

您需要在 for 循环中切换 MN,如下所示:

for i in range(1,M+1):
    matrix[i][0] = matrix[i-1][0] + gap

for j in range(1,N+1):
    matrix[0][j] = matrix[0][j-1] + gap  

由于您最初创建了 M 个项目,每个项目都是一个长度为 N 的列表,matrix[x] 是第 x 个列表(长度为 N)。

另外:1) 所有这些括号增加了太多的混乱; 2) numpy 会让这一切变得更容易。

错误与定义矩阵有关。如果 N 和 M 相同,则不会出现错误。使用不同的 N 和 M 值,您会发现错误。考虑 N=1 和 M=2 的情况,您的矩阵是 [[0, 0], [0, 0], [0, 0]]。现在考虑这段代码: 对于我在范围内(1,(M + 1)): 矩阵[i][0]=(矩阵[(i-1)][0] + 间隙) 如果你的 i 的值为 1 到 3,但你没有 matrix[3][0]。这给出了这样的错误。我无法理解代码的用途。现在改变 M 和 N 我没有得到任何进一步的错误。但我不确定你是否正在寻找这个。我也会包含代码。

s1 = raw_input('1: ')
s2 = raw_input('2: ')
N = len(s1)
M = len(s2)
matrix = [[0 for i in range(N+1)] for j in range(M+1)]
gap = int(raw_input('Enter gap score'))
mismatch = int(raw_input('Enter mismatch score'))
match = int(raw_input('Enter the match score'))

matrix[0][0] = 0

for i in range(1,(M+1)):
    matrix[i][0]=(matrix[(i-1)][0] + gap)

for j in range(1,(N+1)):
    matrix[0][j]=(matrix[0][(j-1)] + gap)  

for i in range(1,M+1):
    for j in range(1,N+1):
        if(s1[j-1] == s2[i-1]):
            score1 = matrix[i-1][j-1] + match

        else:
            score1 = matrix[i-1][j-1] + mismatch

        score2 = matrix[i][j-1] + gap
        score3 = matrix[i-1][j] + gap
        matrix[i][j] = max(score1, score2, score3)