2017-01-19 12 views
-4

Мне нужно ввести строковый ввод (в данном случае последовательность кодонов ДНК) и распечатать соответствующий SLC в последовательности в качестве выхода (например, вход: выход ATT: I). Мой текущий код может достичь этого, но я бы хотел, чтобы он также обслуживал последовательности, которые не имеют длины, делящейся на 3, и вывод «X» для них (например, вход: выход ATTOP: IX. Также есть способ для результатов ? быть напечатан в одной строке, в отличие от нескольких линийУлучшение итерации по строке в тройках в Python

DNA = 'GTTATCTTTPY' 

def translate(DNA): 
    if DNA == 'ATT' or DNA == 'ATC' or DNA == 'ATA': 
     print 'I' 
    elif DNA == 'CTT' or DNA == 'CTC' or DNA == 'CTA' or DNA =='CTG' or DNA == 'TTA' or DNA == 'TTG': 
     print 'L' 
    elif DNA == 'GTT' or DNA == 'GTC' or DNA == 'GTA' or DNA == 'GTG': 
     print 'V' 
    elif DNA == 'TTT' or DNA == 'TTC': 
     print 'F' 
    elif DNA == 'ATG': 
     print 'M' 
    else : 
     print "X" 

for i in range(3, len(DNA) + 1, 3): 
    translate (DNA[i-3:i]) 

выход для выше:

в я F

так Я хотел бы «PY», выдаваемый как «X 'в соответствии с выражением else, но не с длиной, делящейся на три. Также хотелось бы, чтобы вывод был следующим: VIFX.

+0

вы можете добавить символы в строку затем распечатать, что после if..elif – depperm

+0

It помогли бы, если бы вы предоставили примеры входов, результаты, которые вы получаете прямо сейчас, и ожидаемые результаты. – Tagc

+0

См. Edit @Tagc – Zambo004

ответ

1

Для этого лучше использовать biopythonhttp://biopython.org/

from Bio.Seq import Seq 
seq = Seq('GTTATCTTT') 
print(seq.translate()) 

вы получите,

VIF 
1

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

Это может выглядеть следующим образом:

if DNA in ['ATT', 'ATC', 'ATA']: 
    print 'I' 

вместо:

if DNA == 'ATT' or DNA == 'ATC' or DNA == 'ATA': 
    print 'I' 

Если вы хотите, чтобы все буквы в одной строке, можно, например, использовать переменную и просто добавить письма к нему и распечатать его после анализа всего ДНК-кода.

def translate(DNA): 
    output = '' 

    if DNA in ['ATT', 'ATC', 'ATA']: 
     output += 'I' 
    ... 

Чтобы напечатать «X», когда вы получаете меньше, чем 3-х букв или любой другой комбинации, это, вероятно, лучше использовать while цикл.

Ваш код может выглядеть, например, так:

def translate(DNA) 
    output = '' 
    while DNA: #it's the same as while DNA != '' 
     three_letters = DNA[:3] #you should come up with better name ;) 
     DNA=DNA[3:]# in Python 3 this works even if DNA has less than 3 letters, hope it works in Python 2 too 
     if three_letters in ['ATT', 'ATC', 'ATA']: 
      output += 'I' 
     ... #here code all elifs and else inside while loop 

    print output 

Таким образом, у вас есть только привести аргументы в вашу функцию, чтобы получить результат, никакие внешние for петли или такие не нужны.

0

Вот что-то, что делает вещи в основном управляемыми данными, что часто бывает хорошо, потому что это упрощает отладку и поддержку.

xlate_map = { 
    'I': ('ATT', 'ATC', 'ATA'), 
    'L': ('CTT', 'CTC', 'CTA', 'CTG', 'TTA', 'TTG'), 
    'V': ('GTT', 'GTC', 'GTA', 'GTG'), 
    'F': ('TTT', 'TTC'), 
    'M': ('ATG') 
} 

# build a translation table from mapping 
xlate_table = {} 
for code, values in xlate_map.items(): 
    for value in values: 
     xlate_table[value] = code 

def grouper(n, sequence): 
    """s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ...""" 
    for i in xrange(0, len(sequence), n): 
     yield sequence[i:i+n] 

def translate(DNA): 
    res = (xlate_table.get(seq, 'X') for seq in grouper(3, DNA)) 
    return ''.join(res) 

print(translate('GTTATCTTTPY')) # -> VIFX 
+0

Не делает ли это именно то, что вы хотели? – martineau