Вот способ сделать это с помощью регулярного выражения
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]
.Я обнаружил, что эта техника уже в Переполнении стека
Ради интереса, перекодировал ее как функцию, которая позволяет вам указать, хотите ли вы перекрытия (в следующем случае предполагается, что 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]