我试图找到两个DNA序列的LCS。我输出矩阵形式以及包含最长公共序列的字符串。但是,当我在代码中返回矩阵和列表时,我得到以下错误:IndexError:字符串索引超出范围
如果我要删除涉及变量temp和higestcount的编码,我的代码将很好地输出我的矩阵。我试图使用矩阵的类似编码来生成我的列表。有没有办法避免这个错误?基于序列AGCTGGTCAG和TACGCTGGTGGCAT,最长的共同序列应为GCTGGT。
def lcs(x,y):
c = len(x)
d = len(y)
plot = []
temp = ''
highestcount = ''
for i in range(c):
plot.append([])
temp.join('')
for j in range(d):
if x[i] == y[j]:
plot[i].append(plot[i-1][j-1] + 1)
temp.join(temp[i-1][j-1])
else:
plot[i].append(0)
temp = ''
if temp > highestcount:
highestcount = temp
return plot, temp
x = "AGCTGGTCAG"
y = "TACGCTGGTGGCAT"
test = compute_lcs(x,y)
print test
答案 0 :(得分:0)
在temp.join(temp[i-1][j-1])
temp的第一次迭代中,变量为空字符串,''
字符串中没有可以通过索引调用的字符,因此temp [any_number]会抛出index out of range
异常。
答案 1 :(得分:0)
据我所知,join()用另一个字符串连接一个字符串数组。例如,"-".join(["a", "b", "c"])
将返回a-b-c
。
此外,您首先将temp
定义为字符串,但稍后使用双索引引用它,就好像它是一个数组一样。据我所知,您可以通过单个索引调用引用字符串中的字符。例如,a = "foobar"
,a[3]
会返回b
。
我将您的代码更改为以下内容。初始化数组以避免索引问题。
def lcs(x,y):
c = len(x)
d = len(y)
plot = [[0 for j in range(d+1)] for i in range(c+1)]
temp = [['' for j in range(d+1)] for i in range(c+1)]
highestcount = 0
longestWord = ''
for i in range(c):
for j in range(d):
if x[i] == y[j]:
plot[i+1][j+1] = plot[i][j] + 1
temp[i+1][j+1] = ''.join([temp[i][j],x[i]])
else:
plot[i+1][j+1] = 0
temp[i+1][j+1] = ''
if plot[i][j] > highestcount:
highestcount = plot[i][j]
longestWord = temp[i][j]
return plot, temp, highestcount, longestWord
x = "AGCTGGTCAG"
y = "TACGCTGGTGGCAT"
test = lcs(x,y)
print test
答案 2 :(得分:0)
在我看来,你正在经历一个不必要的复杂的屏幕,这导致混乱,包括其他人提到的空字符串。
例如,这仍然非常冗长,但我认为更容易理解(并返回预期答案):
def lcs(seq1, seq2):
matches = []
for i in range(len(seq1)):
j = 1
while seq1[i:j] in seq2:
j+=1
if j > len(seq1):
break
matches.append( (len(seq1[i:j-1]), seq1[i:j-1]) )
return max(matches)
seq1 = 'AGCTGGTCAG'
seq2 = 'TACGCTGGTGGCAT'
lcs(seq1, seq2)
返回
(6, 'GCTGGT')