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)
我收到了错误代码
Traceback(最近一次调用最后一次):
文件" C:\ Users \ Matt \ workspace \ ch3skills \ ch3skills.py",第67行,in
matrix [0] [j] =(matrix [0] [(j-1)] + gap)
IndexError:列表分配索引超出范围
答案 0 :(得分:1)
错误在于定义矩阵。如果N和M相同,则不会出现错误。使用不同的N和M值,您会发现错误。考虑N = 1和M = 2的情况,你的矩阵是[[0,0],[0,0],[0,0]]。现在考虑这段代码: 对于范围内的i(1,(M + 1)): matrix [i] [0] =(matrix [(i-1)] [0] + gap) 如果您的值为1到3,但您没有矩阵[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)
答案 1 :(得分:0)
您需要在M
循环中切换N
和for
,如下所示:
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会使这一切变得更容易。