最长的通用序列 - 语法错误

时间:2014-09-29 00:48:30

标签: python string sequences lcs

我试图找到两个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

3 个答案:

答案 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')