0

我无法让我的代码完全按照我的意愿行事。我想定义一个函数,它接受两个数字作为参数,并使用这些数字来查看以前存储为字符串的 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,11 而不是 5,9,所以我无法改变它来给出这个结果。

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 回答