Функция поиска 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
, Если вы предоставите это, он начнет смотреть с этой позиции индекса. Используйте это в цикле, и вы получите все свои индексы.
Другой подход заключается в использовании регулярных выражений. Помните, что мотивы могут накладываться друг на друга, поэтому вам нужно использовать опережающее утверждение.