使用python在RNA序列的一部分内碱基配对

时间:2012-05-10 14:56:52

标签: python bioinformatics

我遇到问题让我的代码完全符合我的要求。我想定义一个函数,它接受两个数字作为参数,并使用数字来查看以前存储为字符串的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

1 个答案:

答案 0 :(得分: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

如果您对此如何运作有任何疑问,请与我们联系。