Попытка найти комбинацию определенных символов в длинной строке - PullRequest
0 голосов
/ 02 июля 2019

С учетом этой длинной строки 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 ]

3 голосов
/ 02 июля 2019
i=0
while True:
    i=s.find("ATG",i)
    if i == -1: break
    i+=3
    print(i)
2 голосов
/ 02 июля 2019

Вот способ сделать это с помощью регулярного выражения

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]
2 голосов
/ 02 июля 2019

Это должно быть то, что вы пытались кодировать:

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]
0 голосов
/ 02 июля 2019

Для одного вкладыша (смоделировано после этого ответа ):

>>> res = [n+3 for n in range(len(s)) if s.find('ATG', n) == n]
>>> res
[8, 110, 278, 336, 340]
0 голосов
/ 02 июля 2019

В вашем коде есть несколько ошибок, вы используете y как индекс в цикле for, а затем как строковое значение.

Вы увеличиваете i на 3, поэтому вы проверяете вхождения ATG только виндексы 0,3,6, ... Вы хотите обновить индекс на 1 за один раз (что для вас делает цикл for), а затем изменить диапазон так, чтобы он был len(s)-2.

for i in range(len(s)-2):
    y = s[i : i + 3] 
    if y == 'ATG':
        print(i+3)

0 голосов
/ 02 июля 2019

Вы меняете значение y и i.я не определен для каждой итерации.То, что вы пытаетесь сделать, это

idx = 0

while idx < len(s) - 2:
    tempStr = s[idx : idx + 3]
    if tempStr == 'ATG':
        print(s.index(idx)+3)
        idx += 3
    else:
        idx += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...