截至目前,这是我的代码:
def get_orf(DNA):
codon = ''
if(DNA[0:3] == 'ATG'):
codon = DNA[0:3]
for x in range(3,len(DNA)+1,3):
if DNA[x:x+3] == "TAG" or DNA[x:x+3] == "TAA" or DNA[x:x+3] == "TGA":
return codon
else: codon = codon + DNA[x:x+3]
if codon[-3:] in ["TAG", "TAA", "TGA"]:
return codon
else: return 'No ORF'
def one_frame(DNA):
x = 0
ORFlist = []
while x < len(DNA):
codon = DNA[x:]
if DNA.startswith('ATG'):
get_orf(DNA[x:])
if codon:
ORFlist.append(codon)
x += len(codon)
return(ORFlist)
get_orf函数可以正常工作,但是我的one_frame函数不起作用。 假设one_frame函数将DNA字符串作为输入。它搜索 从左到右的三个核苷酸倍数的字符串-即在一个阅读框中。什么时候 它命中了起始密码子“ ATG”,并在该起始密码子处对字符串的片段调用了get_orf (直到最后)以获取ORF。将该ORF添加到ORF列表中,然后该函数跳过 在DNA字符串的前面,到我们刚发现并开始寻找的ORF之后的位置 下一个ORF。重复此过程,直到遍历整个DNA字符串为止。
答案 0 :(得分:1)
我可以看到一些明显的问题,但是不确定您想要什么,希望对您有所帮助。首先,除非DNA以'ATG'开头,否则for
中的one_frame
循环将永远不会结束。我认为您想检查codon.startswith
而不是DNA.startswith
。您还需要在if语句之外执行x+=
命令,否则当您未按“ ATG”键时它将永远不会更新,因此循环将永远继续。您也根本没有使用get_orf
的值。
我认为这可以解决问题,
def one_frame(DNA):
x = 0
ORFlist = []
while x < len(DNA):
codon = DNA[x:]
# Check codon instead of DNA
if codon.startswith('ATG'):
# Record the return value of get_orf
orf_return_value = get_orf(DNA[x:])
if orf_return_value:
ORFlist.append(orf_return_value)
x += len(orf_return_value)
# Increment by 3 if we don't hit ATG
else:
x += 3
return(ORFlist)