2

だから、私はこのコードを持っています:

def pairwiseScore(seqA, seqB):

    score = 0
    length = len(seqA)
    similarity = []

    for x in xrange(length):

        if seqA[x] == seqB[x]:
            if (x >= 1) and (seqA[x - 1] == seqB[x - 1]):
                score += 3
                similarity.append(x)
            else:
                score += 1
                similarity.append(x)                
        else:
            score -= 1

    return ''.join((seqA, '\n', ''.join(['|'.rjust(x) for x in similarity]), '\n', seqB, '\n', 'Score: ', str(score)))

これは、この演習のソリューションとなることを目的としています。

それはほとんどうまくいきますが、実行すると:

print pairwiseScore("ATTCGT", "ATCTAT"), '\n', '\n', pairwiseScore("GATAAATCTGGTCT", "CATTCATCATGCAA")

私はこの出力を得ます:

ATTCGT
||    |
ATCTAT
Score: 2 

GATAAATCTGGTCT
| |    |     |      |         |
CATTCATCATGCAA
Score: 4

ご覧のとおり、これらのパイプ(または垂直バー)は適切にフォーマットされていません。

次のようになります。

>>> print pairwiseScore("ATTCGT", "ATCTAT")
ATTCGT
||   |
ATCTAT
Score: 2 
>>> print pairwiseScore("GATAAATCTGGTCT", "CATTCATCATGCAA")
GATAAATCTGGTCT
||  |||  |   
CATTCATCATGCAA
Score: 4 
>>>

私の質問は:

これの何が問題なのですか:

''.join(['|'.rjust(x) for x in similarity]

関数?これらのパイプを出力時に適切にフォーマットするには、どのように編集する必要がありますか? 乾杯!

4

2 に答える 2

1

類似値はバーの絶対位置ですが、rjust()関数を使用する方法では、前の位置からの相対位置を渡す必要があります。

たとえば、関数の下部でこれを行うことができます。

prev = -1
relative_similarity=[]
for x in similarity:
  relative_similarity.append(x-prev)
  prev=x

return ''.join((seqA, '\n', ''.join(['|'.rjust(x) for x in relative_similarity]), '\n', seqB, '\n', 'Score: ', str(score)))
于 2012-08-18T15:10:18.857 に答える
1

だから、 Vaughn Catoのおかげで、解決策にたどり着きました。あなたの数行のコードを使用して、私の方法は最終的に機能しましたが、最後のテストケースに合格しませんでした->ここに画像の説明を入力

それがコードでした:

def pairwiseScore(seqA, seqB):

    prev = -1
    score = 0
    length = len(seqA)
    similarity = []
    relative_similarity = []

    for x in xrange(length):

        if seqA[x] == seqB[x]:
            if (x >= 1) and (seqA[x - 1] == seqB[x - 1]):
                score += 3
                similarity.append(x)
            else:
                score += 1
                similarity.append(x)                
        else:
            score -= 1

    for x in similarity:

        relative_similarity.append(x - prev)
        prev = x

    return ''.join((seqA, '\n', ''.join(['|'.rjust(x) for x in relative_similarity]), '\n', seqB, '\n', 'Score: ', str(score)))

だから私はあなたの例を少し修正して、これを作りました:

def pairwiseScore(seqA, seqB):

    score = 0
    bars = [str(' ') for x in seqA] #create a list filled with number of spaces equal to length of seqA string. It could be also seqB, because both are meant to have same length
    length = len(seqA)
    similarity = []

    for x in xrange(length):

        if seqA[x] == seqB[x]: #check if for every index 'x', corresponding character is same in both seqA and seqB strings
            if (x >= 1) and (seqA[x - 1] == seqB[x - 1]): #if 'x' is greater than or equal to 1 and characters under the previous index, were same in both seqA and seqB strings, do..
                score += 3
                similarity.append(x)
            else:
                score += 1
                similarity.append(x)                
        else:
            score -= 1

    for x in similarity:
        bars[x] = '|' #for every index 'x' in 'bars' list, replace space with '|' (pipe/vertical bar) character 

    return ''.join((seqA, '\n', ''.join(bars), '\n', seqB, '\n', 'Score: ', str(score)))

そして、このコードは s3-q11 演習のすべてのテスト ケースに合格します。すっごく、私は解決策を得たと思います、そして私は終わりました。

ありがとうと乾杯:)

于 2012-08-19T19:21:58.210 に答える