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

时间:2015-01-22 05:49:06

标签: python python-2.7 multidimensional-array

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:列表分配索引超出范围

2 个答案:

答案 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循环中切换Nfor,如下所示:

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会使这一切变得更容易。