0

2 つの DNA 配列の LCS を見つけようとしています。行列形式と、最長の共通シーケンスを含む文字列を出力しています。ただし、コードでマトリックスとリストの両方を返すと、次のエラーが発生します: IndexError: string index out of range

変数 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
4

3 に答える 3

0

私の知る限り、join() は文字列の配列を別の文字列で結合します。たとえば、"-".join(["a", "b", "c"])を返しa-b-cます。

さらに、文字列として定義することから始めましたtempが、後でダブル インデックスを使用して、ほとんど配列であるかのように参照します。私の知る限り、1 回のインデックス呼び出しで文字列内の文字を参照できます。たとえば、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
于 2014-09-29T01:46:04.320 に答える
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')
于 2014-09-29T02:08:12.880 に答える