У меня есть две строки:

 t = 'GATATCATGCATATACTT'
 s = 'ATAT'

Я пытаюсь создать функцию, которая возвращает в списке позиции, в которых причина строки s была найдена в последовательности строки t. То есть в этом случае позиции будут [1, 10]. Но также, если причина не найдена, список вернет [-1].

 def search_motif (t, s):
     search_motif = list()
     for i, x in enumerate(t):
         if s in x:
             search_motif.append(i)
     i + = 1

     return [-1] # this must go to the end

 print (search_motif (t, s))

Я иду правильным путем? Кто-нибудь может помочь мне?

1
Angellys Correa 19 Дек 2021 в 05:08
Очевидно, ваша функция не возвращает результатов. Вы запускали это в отладчике?
 – 
Mad Physicist
19 Дек 2021 в 05:16
Вы начинаете правильно, но не используете цикл правильно. Что x в петле? Вы не возвращаете созданный список, если он не пустой. Я рекомендую что-нибудь вроде return search_motif or [-1]
 – 
Mad Physicist
19 Дек 2021 в 05:17
Вот ваш дубликат: stackoverflow.com/q/4664850/2988730
 – 
Mad Physicist
19 Дек 2021 в 06:04

2 ответа

Лучший ответ

Использование регулярных выражений кажется лучшим способом.

import re

def search_motif(t, s):
    p = re.compile(s)
    motif = []
    for mo in p.finditer(t):
        motif.append(mo.start())
    
    if motif:
        return motif
    else:
        return -1

Изменить: mo.span () [0] -> mo.start ()

2
BG Park 19 Дек 2021 в 06:09

Для этого можно использовать str.index

>>> def findall(text,subtext):
        i=0
        ind=[]
        while True:
            try:
                i = text.index(subtext,i) #the second argument tell where to start looking for the sub string
                ind.append(i)
                i +=1 #for the next iteration we start looking in the immediate next index
            except ValueError: #we break when no more occurrences are found 
                break 
        if i==0: #we check if we didn't found a match before
            ind.append(-1)
        return ind

        
>>> t = 'GATATCATGCATATACTT'
>>> s = 'ATAT'
>>> findall(t,s)
[1, 10]
>>> findall(t,"X")
[-1]
>>> 

Теперь о вашем коде. Есть две причины, по которым он не работает: во-первых, вы не возвращаете составленный список, а во-вторых, потому что вы смотрите на отдельные символы.

>>> for i,x in enumerate("HELLO"):
    print(x)

    
H
E
L
L
O
>>>     

И если вы не ищете персонажа, вы никогда не найдете совпадения

1
Copperfield 19 Дек 2021 в 05:42