试图找到长字符串中某些字符的组合

时间:2019-07-02 18:13:34

标签: python python-3.x string loops indexing

给出长字符串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”之后,循环似乎停止了,而不是一直遍历字符串直到结束。

6 个答案:

答案 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]