鉴于此字符串
dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"
以下代码应打印以下4个子字符串。
ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGTGA
然而,它正在打印以下内容:
ATGTAA
ATGAATGACTGATAG
ATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTATGA
ATGAAAATGTGA
ATGTGA
ATGACCC
None
请有人帮我解决这个问题。谢谢。
def findStopIndex(dna,index):
stop1 = dna.find("tga",index)
if(stop1 == -1 or (stop1-index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa",index)
if(stop2 == -1 or (stop2-index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag",index)
if(stop3 == -1 or (stop3-index) % 3 != 0):
stop3 = len(dna)
return min(stop1, min(stop2,stop3))
def printAll(dna):
gene = None
start = 0
while(True):
loc = dna.find("atg", start)
if(loc == -1):break
stop = findStopIndex(dna,loc+3)
gene = dna[loc:stop+3]
print gene.upper()
start = loc + 3
print printAll(dna3.lower())
答案 0 :(得分:1)
我认为你可以更好地解释它,但是为了获得你想要的东西,你不能像那样返回分钟,或者当你必须以其他方式对待它时。你得到的长链是因为你正在回归' 60'这是整个序列的长度。我对代码进行了一些修改,它只会选择以“tga'”,“taa'”或“' tag'”之一结尾的序列。
def findStopIndex(dna, index):
stop1 = dna.find("tga", index)
if (stop1 == -1 or (stop1 - index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa", index)
if (stop2 == -1 or (stop2 - index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag", index)
if (stop3 == -1 or (stop3 - index) % 3 != 0):
stop3 = len(dna)
end_sequence = min(stop1, stop2, stop3)if min(stop1, stop2, stop3) < 60 else None
return end_sequence
def printAll(dna):
start = 0
while True:
loc = dna.find("atg", start)
if loc == -1:
break
stop = findStopIndex(dna, loc + 3)
if stop:
gene = dna[loc:stop+3]
print(gene.upper())
start = loc + 3
return
printAll(dna3.lower())
<强>输出:强>
ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGAAAATGTGA
ATGTGA
答案 1 :(得分:0)
的变化:
1)min应该使用“key = int”,否则排序将以字符串...
完成return min(stop1,stop2,stop3, key=int)
2)使用exit替换break以避免使用while
时的另一个循环答案 2 :(得分:0)
我们可能需要一些关于DNA结构的其他信息。根据您的描述,感觉像的子串不能相互重叠。在这种情况下,您需要将start = loc + 3
替换为start = stop + 3
(字符似乎按3分组,也基于您所描述的内容)。
最后,您不需要print
中的print printAll(dna3.lower())
,因为它会在结果集的末尾显示None
(该功能不具备返回值)。
通过这些修改,我的输出是:
ATGTAA
ATGAATGACTGATAG
ATGCTTGTATGCTATGAAAATGTGAAATGACCC
希望它会有所帮助。
答案 3 :(得分:0)
将start = loc + 3更改为 start = loc + len(gene)+ 3
def findStopIndex(dna,index):
stop1 = dna.find("tga",index)
if(stop1 == -1 or (stop1-index) % 3 != 0):
stop1 = len(dna)
stop2 = dna.find("taa",index)
if(stop2 == -1 or (stop2-index) % 3 != 0):
stop2 = len(dna)
stop3 = dna.find("tag",index)
if(stop3 == -1 or (stop3-index) % 3 != 0):
stop3 = len(dna)
return min(stop1, min(stop2,stop3))
def printAll(dna):
gene = None
start = 0
while(True):
loc = dna.find("atg", start)
if(loc == -1):break
stop = findStopIndex(dna,loc+3)
gene = dna[loc:stop+3]
print gene.upper()
start = loc +len(gene)+ 3
dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"
printAll(dna3.lower())
答案 4 :(得分:0)
我认为,你不想要结果,导致打印字符串直到最后,所以你必须排除这些情况。 最好在所有结局中使用for循环:
def findStopIndex(dna, index):
stops = []
for tag in ["TGA", "TAA", "TAG"]:
stop = dna.find(tag, index)
if stop >= 0 and (stop - index) % 3 == 0:
stops.append(stop)
return min(stops)
def printAll(dna):
dna = dna.upper()
start = 0
while True:
loc = dna.find("ATG", start)
if loc == -1:
break
try:
stop = findStopIndex(dna, loc + 3)
except ValueError:
# no ending found
pass
else:
print(dna[loc:stop+3])
start = loc + 3
printAll(dna3)
但是我认为,你真正想要的是找到TGA,TAA和TAG中的一个,即使TGA发生在一个位置之间,也就是不能被3整除。这可以通过正则表达式完成:
import re
def printAll(dna):
dna = dna.upper()
start = 0
while True:
mtch = re.search("ATG(...)*?(TGA|TAA|TAG)", dna[start:])
if not mtch:
break
print(mtch.group())
start += mtch.start() + 3
printAll(dna3)
并导致另外两次出现:
ATGTAA
ATGAATGACTGA
ATGACTGATAGATATGCTTGTATGCTATGA
ATGCTTGTATGCTATGAAAATGTGAAATGA
ATGCTATGA
ATGAAAATGTGA
ATGTGA