0

コードで自分のやりたいことを正確に実行するのに問題があります。引数として2つの数値を取り、その数値を使用して、以前は文字列として格納されていたRNAコードのセクションを調べる関数を定義したいと思います。

次に、「a」と「u」のペアと「g」と「c」のペアになるように、セクション内のすべての可能な塩基対をカウントしたいと思います。ただし、ペア間には3文字のギャップが必要であり、ペアをクロスオーバーすることはできません。たとえば、rna[4]がrna[10]とペアになっている場合、rna[5]はrna[12]とペアにできません。ただし、ペアが4と10の間、つまり5と9の間に発生した場合は、問題ありません。

これまでのところ私は

def base_pairs(x,y):
return (x=='a' and y=='u' or
    x=='u' and y=='a' or
    x=='c' and y=='g' or
    x=='g' and y=='c' or
    x=='g' and y=='u' or
    x=='u' and y=='g' )

rna = raw_input('Enter RNA sequence: ')
n = len(rna)

def opt(x,y):
    for i in range(x,y-5):
        j = i+4
        if base_pairs(rna[i],rna[j])==1:
            print i,j
            a = i
            b = j
            if b-a > 3:
                if base_pairs(a+1,b-1)==1:
                    print a+1,b-1
                    a = a+1
                    b = b-1
        else:
            j=j+1

たとえば、accguugacgcagと入力すると、opt(0,12)を使用して0,4 5,11 6,10を取得したいのですが、現在は0,4しか取得していません。

4

1 に答える 1

0

私はあなたの関数の新しいバージョンを始めました。私はあなたの質問へのコメントで私が言及したアイデアを取り入れました。さらに、rna文字列をパラメーターにしましたが、これはかなり簡単に削除できます。このバージョンでは、要求した出力は生成されませんが、ニーズに合わせて調整できる可能性があります。私のマシンの出力はo、4と5,9です。なぜ5,9よりも5,11を好むのか理解できなかったので、その結果を出すために変更することはできませんでした。

def is_base_pair(x, y):
    return (x=='a' and y=='u' or
            x=='u' and y=='a' or
            x=='c' and y=='g' or
            x=='g' and y=='c' or
            x=='g' and y=='u' or
            x=='u' and y=='g' )

# start and end are the inclusive range of places in which to look for pairs
def opt(rna, start, end):
    # if the range is too small, give up
    if start + 4 > end:
        return

    # the next left side to try to match
    nextLeft = start

    while nextLeft + 4 <= end:
        # find the right nucleobase to match the one at nextLeft
        #   start looking at the minimal distance and incrementally get bigger
        potentialRight = nextLeft + 4
        while not is_base_pair (rna[nextLeft], rna[potentialRight]) and potentialRight <= end:
            potentialRight += 1

        if is_base_pair (rna[nextLeft], rna[potentialRight]):
            print nextLeft, potentialRight
            # recursively search for pairs between the elements of this pair
            opt(rna, nextLeft + 1, potentialRight - 1)
            nextLeft = potentialRight + 1
        else:
            nextLeft += 1

これがどのように機能するかについて質問があれば教えてください。

于 2012-05-10T16:06:25.877 に答える