给出长字符串s:
ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCCCCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGCCTCCTGACTTTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGGAAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCCCTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAGTTTAATTACAGACCTGAA
我正在尝试查找每次出现的字符“ ATG”,并打印每次出现此组合后出现的字符的索引。
我已经尝试过遍历该字符串,并且到目前为止,只有在找到字符“ ATG”的第一个出现并在其后打印出该字符的索引(即8)之后,才成功。但是,我的程序停止了之后,即使字符串中出现了更多的字符“ ATG”。
for y in range(len(s)):
y = s[i : i + 3]
i = i + 3
if y == 'ATG':
print(s.index(y)+3)
在代码“ s”的这一部分中是字符串。 结果是8,因为它找到了“ ATG”的第一个出现,并在此之后打印出字符的索引。我的预期结果应该是8、110、278、336和340。在第一次找到“ ATG”之后,循环似乎停止了,而不是一直遍历字符串直到结束。
答案 0 :(得分:3)
i=0
while True:
i=s.find("ATG",i)
if i == -1: break
i+=3
print(i)
答案 1 :(得分:2)
这应该是您尝试编写的代码:
s = "ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCCCCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGCCTCCTGACTTTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGGAAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCCCTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAGTTTAATTACAGACCTGAA"
search_str = 'ATG'
for y in range(len(s)-len(search_str)+1):
sub_str = s[y : y + 3]
if sub_str == search_str:
print(y+len(search_str))
8
110
278
336
340
如果固定线'ATG'
需要单线,请按以下步骤操作:
res = [n+3 for n in range(len(s)-2) if s[n:n+3] == 'ATG']
print(res)
[8, 110, 278, 336, 340]
答案 2 :(得分:2)
这是使用正则表达式的一种方法
import re
helix = "ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCCCCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGCCTCCTGACTTTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGGAAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCCCTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAGTTTAATTACAGACCTGAA"
iter = re.finditer(r"ATG", helix)
indices = [m.end(0) for m in iter]
print(indices)
结果为[8, 110, 278, 336, 340]
。
我发现这种技术是already in Stack Overflow
只是为了好玩,将其重新编码为一个函数,可让您指定是否要重叠(以下假设已经定义了helix
)。
import re
def locate(haystack, needle, overlap=False):
iter = re.finditer(f'(?=' + needle + r')' if overlap else needle, haystack)
return [m.end(0) for m in iter]
print(locate(helix, 'ATG'))
print(locate(helix, 'CCC', True))
结果:
[8, 110, 278, 336, 340]
[15, 16, 17, 63, 68, 69, 82, 83, 177, 194, 195, 245, 246, 247, 248, 249, 278, 330]
答案 3 :(得分:0)
您正在更改y和i的值。我没有为每个迭代定义。你想做的是,
<Button on:click={handler}/>
答案 4 :(得分:0)
您的代码中存在多个错误,您在y循环中使用y作为索引,然后在字符串值中使用
。您将i递增3,因此您仅在索引0、3、6,...上检查ATG的出现。您想同时将索引更新1(for循环为您完成),并且然后更改范围,使其为len(s)-2
。
for i in range(len(s)-2):
y = s[i : i + 3]
if y == 'ATG':
print(i+3)
答案 5 :(得分:0)
对于一个班轮(以this answer为例):
>>> res = [n+3 for n in range(len(s)) if s.find('ATG', n) == n]
>>> res
[8, 110, 278, 336, 340]