Я пытаюсь обратно дополнить последовательность ДНК fasta

Я пытался обратно комплементировать последовательность ДНК fasta. Вот мой код:

fastafile=open('sequence (3).fasta','r')
entries=[]
reverse=""
sequence=['A','T','G','C','N']
for line in fastafile:
    if not line.startswith('>'):
        line = line.split()
        entries.append(line)
print entries
for index in range(0,len(entries[::-1])):
    if index !=sequence:
        print "this is not a valid nucleotide"
        break
    else:
        if index=='A':
            reverse+='T'
        elif index=='T':
            reverse+='A'
        elif index=='C':
            reverse+='G'
        elif index=='G':
            reverse+ 'C'
        elif index=='N':
            reverse+='N'
print reverse

И каждый раз, когда я получаю вывод, это недопустимый нуклеотид, даже когда мой вывод записей показывает, что в нем есть элементы в последовательности. Вот пример вывода, когда я печатаю ввод;

[['GCTCCCCTGAGGTTCGGCACCCACACTCCCTTCCCAGGAGCTCGCGATGCAAGAGCCACAGTCAGAGCTC'], ['AATATCGACCCCCCTCTGAGCCAGGAGACATTTTCAGAATTGTGGAACCTGCTTCCTGAAAACAATGTTC'], ['TGTCTTCGGAGCTGTGCCCAGCAGTGGATGAGCTGCTGCTCCCAGAGAGCGTCGTGAACTGGCTAGACGA']

Как я могу обойти эту проблему? Я просто хочу добавить, что я начал серьезно программировать на Python около 2 месяцев назад, поэтому я все еще учусь и совершенствуюсь. Спасибо!


person B_bunny    schedule 19.02.2017    source источник


Ответы (1)


Ваш оператор цикла:

for index in range(0,len(entries[::-1])):

Это будет перебирать длину записей, то есть 0, 1, 2, 3, ..., len(entries).

Когда вы делаете if index != sequence, вы на самом деле сравниваете целое число со списком, скажем, if 3 != ['A', 'C', 'T', 'G']. Я полагаю, вы можете видеть, что это не имеет смысла. Что вы, вероятно, захотите сделать, так это посмотреть, является ли нуклеотид в последовательности допустимым нуклеотидом, следовательно, он находится в списке sequence. Вы можете сделать это следующим образом:

if entries[::-1][index] in sequence # Will be true if the nucleotide at entries[::-1][index] is inside sequence

Позвольте мне сказать две вещи:

  • Во-первых, вам не нужно достигать len(entries[::-1]), это то же самое, что и len(entries).

  • Во-вторых, и это более важно, есть реальный модуль, построенный специально для биоинформатики. Он называется Biopython. Он имеет специальные объекты и функции. Например, ваша проблема может быть решена следующим образом:

-

from Bio.Seq import Seq

dna = Seq("ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG")
print dna.reverse_complement()

Вывод: CTATCGGGCACCCTTTCAGCGGCCCATTACAATGGCCAT

person Carles Mitjans    schedule 19.02.2017
comment
Спасибо за помощь. Я не так хорошо знаком с большинством модулей biopython, но seq требует, чтобы я вводил строку последовательности нуклеотидов, где, как и в моем случае, я хочу использовать последовательность fasta из файла в качестве ввода. - person B_bunny; 20.02.2017