Получение дополнения к символу

#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 строка находится впереди вашей print строки, поэтому оператор печати никогда не будет достигнут. Ваша elif логика не работает. Ваше while утверждение исключает его когда-либо, и даже если это не так if , утверждение означает elif , что оно будет достигнуто только в том случае, если нет ДНК (т. Е. If len(dna) <= 0 ), что не то, что вы хотите. Более того, вы, вероятно, хотите, чтобы он читал elif not {'A','T','C','G'}.issubset(set(dna)): , что в вашем первом наборе нуклеиновых кислот () отсутствует запятая {'A','T','C''G'} .