Счет кодонов на данной последовательности мрны в питоне - PullRequest
0 голосов
/ 23 сентября 2019

Это код, который я пытался использовать, но он не работает должным образом:

mrna = input("Please enter mRNA sequence: ")
start = mrna.find('AUG')
if start != -1:
    while start + 2 < len(mrna):
        codon = mrna[start:start + 3]
        if codon == "UAA": 
            break
        print(codon)
        start += 3

Ожидаемый стартовый кодон: AUG

Ожидаемый стоп-кодон: UAA или UAG или UGA Если, например:

input = "AUGUGA"
output = 1

input = "GAGAUGUUGGUUUAA"
output = 3

Я действительно не знаю, что не так.

1 Ответ

0 голосов
/ 23 сентября 2019

Вы нигде не отображаете цифры в своем коде.Количество кодонов - это разница между конечным и начальным индексами, пол делится на 3.

Вы можете использовать генератор, чтобы помочь вам проверить кодоны.

mrna = input("Please enter mRNA sequence: ")
start = mrna.find('AUG')
if start != -1:
    end, last = next((x, mrna[x:x + 3] for x in range(start + 3, len(mrna) - 3, 3) if mrna[x:x + 3] in ('UAA', 'UAG', 'UGA')), (len(mrna), 'end'))
    print(f'{(end - start) // 3} codons between AUG and {last}')
else:
    print('AUG not found')

Генератор (x, mrna[x:x + 3] for x in range(start + 3, len(mrna) - 3, 3) if mrna[x:x + 3] in ('UAA', 'UAG', 'UGA')) перебирает все кодоны от индекса start + 3 до конца и выдает кодоны, которые соответствуют чему-либо в ('UAA', 'UAG', 'UGA'), вместе с индексом.next обычно возвращает следующий (первый) элемент итератора.Со вторым аргументом он возвращает дополнительный аргумент в качестве часового вместо того, чтобы вызывать StopIteration, когда итератор заканчивается.// является оператором деления усечения, поэтому он будет работать правильно, даже если len(mrna) не кратно 3 от start.

...