Функция поиска Python не работает. Что я делаю неправильно?

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

В любом случае, я выполняю упражнение rosalind.info ( http://rosalind.info/problems/subs/), которое хочет, чтобы я нашел каждый индекс, где конкретный мотив ДНК содержится в большей последовательности ДНК. По сути, мне нужно найти индексы подстроки в строке. Должно быть легко, правда? Ну, может ты поможешь мне.

Итак, вот мой код:

with open('rosalind_subs.txt') as f:
    seq = f.readline()
    seq.strip()
    subs = f.readline()
    subs.strip()
    break

def finder(x, y):
    index = x.find(y)
    return index

print("sequence is: " + seq)
print("subs is: " + subs)

print(finder(seq, subs))

И вот мой вывод:

sequence is:  ACCAGTCTCTTTTTTCTCTTTTCTCTTTTCTCTTTTGACCCTCTTTTCGTCACTCTTTTACCTCTTTTTCTCTTTTACTCTTTTCTCTTTTACTCTTTTACTCTTTTAGCGCAGATCTCTTTTCTCTTTTGGCTCTTTTGTCATCCTCTTTTAGACTCTTTTGGGAAGCGACGCCTCTTTTCTCTTTTCTCTTTTGCCTCTTTTTATAACCTAAAAGACTCTTTTCCCTCTTTTCCGATTTGCCAAGGGCTCTCTTTTCTCTTTTGCTCTTTTCTCTTTTCTCTTTTTACTCTTTTCTCTTTTCGCCCCAAGATTAACTCTTTTTCTCTTTTCTCTCTTTTTTCCTCTTTTCTCTTTTGAATTGACCTCTTTTTCTCTTTTTTTGGGCCGCTCTTTTCTCTTTTACTCTTTTCTCTCTTTTAACAGCTCTTTTCCTTCTCTTTTGTCTCTTTTAGTATACTCTTTTACTCTTTTCTCTTTTCTCTCTTTTACTCTTTTGCTCTTTTCTCTTTTTGTCTCTTTTGCCCTGTCTCTTTTCACGCTTCTCTTTTAGTGTACTCTTTTACTCTTTTTGGCTCTTTTCGAATTTGTTAGCTCTTTTGCTCTTTTCTCTTTTGCTCTTTTGTCTCTTTTGATCAGATTCTCTTTTTCTCTTTTCTCTTTTCCTTAAGCAGATTTCTCTTTTCTCTTTTTCTCTCTTTTGCTCTTTTACTCTTTTACTGCTTTCTCTTTTACAACCTCTTTTACTCTTTTAAGCTCTTTTCTCTTTTGCGCCTCTTTTCCTCCCCTCTTTTTAGCTCTTTTCTCTTTTTCGCTCTTTTCAGCTCTTTTCACTCTTTTGTTTTGAGCTCTTTTCAGACTCTTTTATCCTCTTTTTTCCTCTTTTAGCGCTCTTTTGTAGCCTCTTTT

motif is: CTCTTTTCT

-1

***Repl Closed***

Я оставил ***Repl Closed*** там, чтобы не оставить камня на камне. Может быть, это как-то связано с Sublime REPL?

В любом случае, вы, вероятно, не можете сказать, просто посмотрев, но мотив на самом деле обнаруживается МНОГИЕ раз в последовательности ДНК, просто функция поиска не улавливает его. Что дает?

2 ответа

Перерыв не применяется в сферу. Пожалуйста, удалите и попробуйте. Я проверил ниже код.

with open('rosalind_subs.txt') as f:
    seq = f.readline()
    seq.strip()
    subs = f.readline()
    subs.strip()

def finder(x, y):
    index = x.find(y)
    return index

print("sequence is: " + seq)
print("subs is: " + subs)

print(finder(seq, subs))

Выход

>>> 
sequence is: ACCAGTCTCTTTTTTCTCTTTTCTCTTTTCTCTTTTGACCCTCTTTTCGTCACTCTTTTACCTCTTTTTCTCTTTTACTCTTTTCTCTTTTACTCTTTTACTCTTTTAGCGCAGATCTCTTTTCTCTTTTGGCTCTTTTGTCATCCTCTTTTAGACTCTTTTGGGAAGCGACGCCTCTTTTCTCTTTTCTCTTTTGCCTCTTTTTATAACCTAAAAGACTCTTTTCCCTCTTTTCCGATTTGCCAAGGGCTCTCTTTTCTCTTTTGCTCTTTTCTCTTTTCTCTTTTTACTCTTTTCTCTTTTCGCCCCAAGATTAACTCTTTTTCTCTTTTCTCTCTTTTTTCCTCTTTTCTCTTTTGAATTGACCTCTTTTTCTCTTTTTTTGGGCCGCTCTTTTCTCTTTTACTCTTTTCTCTCTTTTAACAGCTCTTTTCCTTCTCTTTTGTCTCTTTTAGTATACTCTTTTACTCTTTTCTCTTTTCTCTCTTTTACTCTTTTGCTCTTTTCTCTTTTTGTCTCTTTTGCCCTGTCTCTTTTCACGCTTCTCTTTTAGTGTACTCTTTTACTCTTTTTGGCTCTTTTCGAATTTGTTAGCTCTTTTGCTCTTTTCTCTTTTGCTCTTTTGTCTCTTTTGATCAGATTCTCTTTTTCTCTTTTCTCTTTTCCTTAAGCAGATTTCTCTTTTCTCTTTTTCTCTCTTTTGCTCTTTTACTCTTTTACTGCTTTCTCTTTTACAACCTCTTTTACTCTTTTAAGCTCTTTTCTCTTTTGCGCCTCTTTTCCTCCCCTCTTTTTAGCTCTTTTCTCTTTTTCGCTCTTTTCAGCTCTTTTCACTCTTTTGTTTTGAGCTCTTTTCAGACTCTTTTATCCTCTTTTTTCCTCTTTTAGCGCTCTTTTGTAGCCTCTTTT

subs is: CTCTTTTCT
15

Еще один биолог, который сделал несколько упражнений на rosalind.info.

Прежде всего, ваш код для чтения в последовательности и мотив могут быть улучшены с помощью splitlines(), который заботится об удалении новой строки. также обратите внимание, как я использую распаковку кортежей, чтобы назначить как seqа также motif Переменная сразу.

with open('rosalind_subs.txt') as f:
    seq, motif = f.read().splitlines()

Далее вы правильно заметили, что find возвращает только индекс первого вхождения вашего мотива. Чтобы найти все вхождения, полезно знать, что поиск принимает другой необязательный аргумент start, Если вы предоставите это, он начнет смотреть с этой позиции индекса. Используйте это в цикле, и вы получите все свои индексы.

Другой подход заключается в использовании регулярных выражений. Помните, что мотивы могут накладываться друг на друга, поэтому вам нужно использовать опережающее утверждение.

Другие вопросы по тегам