我遇到问题让我的代码完全符合我的要求。我想定义一个函数,它接受两个数字作为参数,并使用数字来查看以前存储为字符串的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
答案 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
如果您对此如何运作有任何疑问,请与我们联系。