#python #string #loops #character #complement
#python #строка #циклы #символ #дополнение
Вопрос:
Как не могут работать приведенные ниже коды, чтобы получить дополнение введенного символа? Кажется, что цикл никогда не заканчивается, но, скажем, если я введу «Z» как днк, почему бы ему не сломаться и не выйти? Я использовал разрыв или неправильно? Как насчет elif?
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 ('')
Комментарии:
1. Поскольку ваш пример написан (и поскольку Кибер написал свой ответ на основе вашего примера), вы не получаете дополнение. Они настроены так, что A -> C (вместо дополнения T), T -> G вместо A и т.д. Используя словарь, как это сделал Cyber, он должен выглядеть следующим образом: complement = {‘A’:’T’, ‘T’:’A’, ‘C’:’G’, ‘G’:’C’}
Ответ №1:
Вы должны настроить карту, используя dictionary
complement = {'A': 'C', 'C': 'A', 'T': 'G', 'G': 'T'}
Затем для некоторой строки вы можете сделать
original = "ATCGTCA"
"".join(complement[letter] for letter in original)
Вывод
'CGATGAC'
Только для одного символа:
complement['A']
Вывод
'C'
Комментарии:
1. Что означает i в compliment? И почему присоединяется пустой список? (Я не очень знаком со словарем)
2.
i
это просто текущий элемент, это временная переменная. Я изменил его наletter
, если это имеет больше смысла для чтения. Строка"".join()
принимает выходные данные этого цикла, которые будут представлять собой список, и создает одну единственную строку вместо списка символов.
Ответ №2:
Поскольку ваш пример написан (и поскольку Кибер написал свой ответ на основе вашего примера), вы не получаете дополнение. Вы получаете 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
Где «original» выдает «TAGCAGT», а «bad_original» выдает «Содержит символы, отличные от ДНК».
Обратите внимание, что это дополнение, а не обратное дополнение, которое обычно представляет больший интерес.
В более общем плане, если вы планируете использовать это для последовательностей ДНК, вам, вероятно, следует заглянуть в модуль BioPython (http://biopython.org/wiki/Seq#Complement_and_reverse_complement ), что даст вам дополнение (и обратное дополнение) с большей универсальностью, проверкой ошибок и т.д.
Комментарии:
1. Почему приведенный ниже код не возвращает никакого значения? (Как в it переходит на новую строку после того, как я ее ввел — get_complement(‘ACGTAC’) ничего не вернулось. ) дополнение = {‘A’:’C’, ‘C’:’A’, ‘T’:’G’, ‘G’:’T’} в то время как {‘A’, ‘T’, ‘C’, ‘G’}.issubset(набор (днк)): если len(dna)>0: output = «».join(дополнение (буква) для буквы в днк) else: ({‘A’, ‘T’, ‘C’, ‘G’}!=подмножество(set(dna))) вывод = ‘Символ, не являющийся ДНК!’ break возвращает печать (вывод)
2. Я не могу точно сказать, что вы здесь делаете; пожалуйста, отформатируйте свой код. Я вижу ряд проблем: (1) У вас опечатка, «вывод» для «вывода» (2) Я не могу сказать, что вы пытаетесь сделать в блоке «else», но я уверен, что это не то, что вы хотите сделать. Вы пытаетесь проверить наличие там символов, отличных от ДНК? Должно ли там быть «если»? В любом случае он вложен в предложение «while», которое не должно позволять ему когда-либо быть истинным (3) Предложение while также не проверяет правильность ваших символов ДНК, в любом случае (4) У вас все еще нет правильных дополнений. «C» не является дополнением к «A» и т. Д
3.
complement = {'A':'T', 'T':'A', 'C':'G','G':'C'}
while {'A','T','C''G'}.issubset(set(dna)):
if len(dna) > 0:
output = "".join(complement(i)for i in dna)
elif ({'A', 'T', 'C', 'G'}!=subset(set(dna))):
output = 'Non-DNA character found'
break
return print(output)
4. Ваше форматирование по-прежнему неправильно отображает разрывы строк. Похоже, что ваша
return
строка находится впереди вашейelif
логика не работает. Вашеwhile
утверждение исключает его когда-либо, и даже если это не такif
, утверждение означаетelif
, что оно будет достигнуто только в том случае, если нет ДНК (т. Е. Iflen(dna) <= 0
), что не то, что вы хотите. Более того, вы, вероятно, хотите, чтобы он читалelif not {'A','T','C','G'}.issubset(set(dna)):
, что в вашем первом наборе нуклеиновых кислот () отсутствует запятая{'A','T','C''G'}
.