[英]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)
我得到錯誤代碼Traceback(最近一次通話是最近的):文件“ C:\\ Users \\ Matt \\ workspace \\ ch3skills \\ ch3skills.py”,行67,在矩陣[0] [j] =(matrix [0] [( j-1)] +間隙)
IndexError:列表分配索引超出范圍
錯誤在於定義矩陣。 如果N和M相同,則不會出現錯誤。 使用不同的N和M值,您會發現錯誤。 考慮N = 1和M = 2的情況,您的矩陣是[[0,0],[0,0],[0,0]]。 現在考慮這段代碼:對於范圍(1,(M + 1))中的i:矩陣[i] [0] =(矩陣[(i-1)] [0] +間隙)值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)
您需要在for
循環中切換M
和N
,如下所示:
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將使所有這些變得更加容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.