Получение дополнения персонажа

Как не могут работать приведенные ниже коды, чтобы получить дополнение введенного символа? Кажется, что цикл никогда не заканчивается, но, скажем, если я введу "Z" как днк, почему бы ему не сломаться и не выйти? Я использовал перерыв или если неправильно? Как насчет элифа?

def get_complement(днк):

''' (ch) -> ch

Reverse the 'A' to 'T' or vice versa and 'C' to 'G' and vice versa too.
>>> get_complement('A')
'C'
>>> get_complement('G')
'T'

'''
if dna == 'A':
    print ('C')
    if dna == 'C':
        print ('A')
        if dna == 'T':
            print ('G')
            if dna == 'G' :
                print ('T')
                while  {'A', 'C', 'G', 'T'}.isnotsubset(set(dna)) :
                    break
                return ('')

2 ответа

Решение

Вы должны настроить карту, используя dictionary

complement = {'A': 'C', 'C': 'A', 'T': 'G', 'G': 'T'}

Тогда для какой-то строки вы можете сделать

original = "ATCGTCA"
"".join(complement[letter] for letter in original)

Выход

'CGATGAC'

Только для одного персонажа:

complement['A']

Выход

'C'

Поскольку ваш пример написан (и как Кибер написал свой ответ на основе вашего примера), вы не получите дополнение. Вы получаете A -> C (вместо дополнения T), T -> G вместо A и т. Д.

Используя словарь, как это сделал Cyber, он должен выглядеть так:

complement = {'A':'T', 'T':'A', 'C':'G', 'G':'C'}

И в коде, включая проверку не-ДНК символов:

original = "ATCGTCA"
bad_original = "ATCGTCAZ"

complement = {'A':'T', 'T':'A', 'C':'G', 'G':'C'}
for dna in (original, bad_original):
    try:
        output = "".join([complement[x] for x in dna])
    except KeyError:
        output = "Contains non-DNA characters"

    print output

Где "оригинал" приводит к "TAGCAGT" и "bad_original" приводит к "Содержит не-ДНК символов".

Обратите внимание, что это дополнение, а не обратное дополнение, которое обычно представляет больший интерес.

В более общем смысле, если вы планируете использовать это для последовательностей ДНК, вам, вероятно, следует заглянуть в модуль BioPython ( http://biopython.org/wiki/Seq), который даст вам дополнение (и обратное дополнение) с помощью больше гибкости, проверка ошибок и т. д.

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