Как написать функцию для поиска позиций подстроки в большей строке без использования функции «найти»? - PullRequest
0 голосов
/ 10 февраля 2019

Я только недавно начал использовать python, и я очень плохо знаком с python и программированием в целом, и я нахожусь в классе, где нам дали задание найти функцию в Python, которая берет две строки последовательности ДНК (скажем,string1 и string2) в качестве входных данных и возвращает список позиций, в которых string2 присутствует в качестве подстроки string1.И так как мы должны познакомиться с тем, как работает кодирование, мы не можем использовать встроенную функцию «найти».Я действительно запутался в том, как вообще начать эту проблему.Но это то, что у меня пока есть:

def linear(seq, sub):
    positions = [0]
    for i in range(len(sub)):
        if seq[i:i+len(sub)] == sub:
             positions[0]+=1
    return( positions )

Я получаю сообщение об ошибке, когда я вставляю это, но я должен получить список позиций, где встречается подстрока.Если кто-то может направить меня в каком направлении я должен идти, это было бы очень полезно.

Например, если последовательность 'ATTCCATGGACCTAGTCAT' и подстрока, которую я хочу найти, это 'CAT', тогда вывод должен быть [5,17]

1 Ответ

0 голосов
/ 10 февраля 2019

К сожалению, это не может быть [5,17], так как индексирование в python начинается с 0, оно должно быть [4,16].Вы можете использовать цикл for для перемещения по индексам до последнего индекса минус длина подстроки плюс 1, чтобы не выйти за пределы диапазона.Затем вы проверяете, является ли фрагмент строки, который является текущим индексом до текущего индекса плюс длина подстроки (если он равен 'CAT', то вы получите каждый фрагмент длиной 3 строки),равно подстроке.Если это так, то добавьте индекс в список индексов.

def find(st,sub):
    list_of_pos=[]
    for i in range(len(st)-len(sub)+1):
        if st[i:i+len(sub)]==sub:
            list_of_pos.append(i)
    return list_of_pos

Вы можете сделать его более компактным, если используете понимание списка:

def find(st,sub):
    return [i for i in range(len(st)-len(sub)+1) if st[i:i+len(sub)]==sub]
...