Розалинда разрешение нуб

Это мое решение проблемы, представленное здесь: http://rosalind.info/problems/subs/.

def subs(string,subString):
    lista=[]
    i=0
    while i < (len(string)-len(subString)):
        if string[i:(i+len(subString)-1)]==subString:
           lista.append(i)
        i+=1
    return lista

Что не так с моим кодом?

3 ответа

Решение

Единственное, что не так с этим, это то, что вы не можете добавить целое число в список, вам нужно добавить его:

lista.append(i)

Тогда срез слишком короткий: в Python a[i:j] дает вам все символы с позиции i до, но не включая положение j, Поскольку вы вычитаете 1 из длины, он будет сравнивать один символ слишком мало каждый раз.

Наконец, чтобы получить точный ответ на вопрос, который нужно задать, вам нужно добавить 1 к позиции, потому что Python индексирует массивы, начиная с 0, а не с 1.

def subs(string,subString):
    lista = []
    i = 0
    while i < (len(string)-len(subString)):
        if string[i:i+len(subString)] == subString:
           lista.append(i + 1)
        i += 1
    return lista

Вы также можете сделать это с помощью регулярных выражений, например:

[m.start()+1 for m in re.finditer("(?=ATAT)", "GATATATGCATATACTT")])

Функциональный стиль все напихал:D

def mysub2(string, sub):    
    return [x+1 for x in range(len(string)) if string[x:x+len(sub)] == sub]




>>> def mysub(string, sub):          
    return [x+1 for x in range(len(string)) if string[x:x+len(sub)] == sub]

>>> st = "GATATATGCATATACTT"
>>> sub2 = "ATAT"
>>> mysub(st, sub2)
[2, 4, 10]
>>> 
Другие вопросы по тегам