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

Posted

技术标签:

【中文标题】Python构建二维数组获取列表分配索引超出范围【英文标题】:Python building 2d array getting list assignment index out of range 【发布时间】:2015-03-20 20:19:36 【问题描述】:
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: 列表赋值索引超出范围

【问题讨论】:

也许matrix[0][M] 不存在? 它应该是因为它创建了矩阵 = [[0 for i in range(N+1)] for j in range(M+1)] 但是如果我在 for 中翻转 N 和 M循环它工作得很好。但这会抛出程序的其余部分 len(matrix[0]) 是 N+1 而不是 M+1 【参考方案1】:

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

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)

【讨论】:

是的,我想我必须在创建二维数组时切换它们。但是 for 循环不必更改。但是感谢您提供有关为什么在使二维数组起作用时切换它们的信息。【参考方案2】:

您需要在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 会让这一切变得更容易。

【讨论】:

以上是关于Python构建二维数组获取列表分配索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

Python:IndexError:列表索引超出范围

Swift:填充二维数组时出现索引超出范围错误

在Python中获取超出范围的索引默认值[重复]

删除索引满足条件的每个元素;列表分配索引超出范围

当我遍历我的列表时,返回列表索引超出范围

KeyError:“likeCount”和IndexError:Python中的列表索引超出范围