Получение дополнения персонажа
Как не могут работать приведенные ниже коды, чтобы получить дополнение введенного символа? Кажется, что цикл никогда не заканчивается, но, скажем, если я введу "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), который даст вам дополнение (и обратное дополнение) с помощью больше гибкости, проверка ошибок и т. д.