2013-02-23 6 views
-3

Я написал простую программу для перевода ДНК на РНК. В принципе, вы вводите строку, она отделяет строку от символов и отправляет их в список, сдвигает букву и возвращает строку из результирующего списка. Эта программа правильно переводит a в u и to в a, но не меняет g на c и c на g.Странное поведение в Python

Это программа:

def trad(x): 

    h=[] 
    for letter in x: 
     h.append(letter) 
    for letter in h: 
     if letter=="a": 
      h[h.index(letter)]="u" 
      continue 
     if letter=="t": 
      h[h.index(letter)]="a" 
      continue 
     if letter=="g": 
      h[h.index(letter)]="c" 
      continue 
     if letter=="c": 
      h[h.index(letter)]="g" 
      continue 
    ret="" 
    for letter in h: 
     ret+=letter 
    return ret 

while True: 
    stry=raw_input("String?") 
    print trad(stry) 

Теперь, просто изменяя программу не итерация элементов, но на позиции, он работает, как ожидалось. Это результирующий код:

def trad(x): 
    h=[] 
    for letter in x: 
     h.append(letter) 
    for letter in xrange (0, len(h)): 
     if h[letter]=="a": 
      h[letter]="u" 
      continue 
     if h[letter]=="t": 
      h[letter]="a" 
      continue 
     if h[letter]=="g": 
      h[letter]="c" 
      continue 
     if h[letter]=="c": 
      h[letter]="g" 
      continue 
    ret="" 
    for letter in h: 
     ret+=letter 
    return ret 

while True: 
    stry=raw_input("String?") 
    print trad(stry) 

Почему возникает это странное поведение и как его разрешить?

+1

Исправьте углубление. –

+2

Вы никогда не объясняете проблему с помощью своего первого набора кода. –

+0

Я отредактировал его, чтобы объяснить проблему. Извините за это. –

ответ

7

Вы собираетесь об этом гораздо сложнее путь, чем необходимо, это легко можно сделать с помощью str.translate() - метод на str случаях, что воплощается экземпляров одного персонажа к другому, что это именно то, что вы хотите:

import string 
replacements = string.maketrans("atgc", "uacg") 
while True: 
    stry=raw_input("String?") 
    print stry.translate(replacements) 

Это ответ для 2.x, в 3.x, вместо этого используйте str.maketrans().

+0

Это не только сложнее, но и намного медленнее, чем использование 'translate()'. – martineau

0

Я не уверен, какой тип проблемы у вас есть, но вот простой способ сделать это, используя словарь.

def trad(coding_strand): 
    mRNA_parts = {'a': 'u', 't': 'a', 'g': 'c', 'c': 'g'} 
    mRNA = '' 
    for nucleotide in coding_strand: # this makes it lowercase 
     mRNA += mRNA_parts[nucleotide.lower()] 
    return mRNA.upper() # returns it as uppercase 

У меня он вернулся как прописной, потому что, как правило, нуклеотиды в ДНК/РНК записываются в верхнем регистре.

Я также пересмотрел ваш метод ... Лучше прокручивать сами индексы; то вам не обязательно делать l.index(elem).

def trad(coding_strand): 
    mRNA = [] 
    for index in range(len(coding_strand)): 
     nucleotide = coding_strand[index].upper() 
     if nucleotide == 'A': 
      mRNA.append('U') 
     elif nucleotide == 'T': 
      mRNA.append('A') 
     elif nucleotide == 'C': 
      mRNA.append('G') 
     elif nucleotide == 'G': 
      mRNA.append('C') 
    ret = '' 
    for letter in mRNA: 
     ret += mRNA 
    print ret 

Я не предлагаю использовать строку и добавлять к ней или использовать список; понимание списка намного более эффективно.

Вот полу-один вкладыш, любезно BurhanKhalid:

def trad(coding_strand): 
    mRNA_parts = {'A': 'U', 'T': 'A', 'G': 'C', 'C': 'G'} 
    return ''.join([mRNA_parts[nucleotide] for nucleotide in coding_strand.upper()]) 

Полный один вкладыш:

def trade(coding_strand, key={'A': 'U', 'T': 'A', 'G': 'C', 'C': 'G'}): ''.join(return [key[i] for i in coding_strand.upper()]) 

Некоторые ссылки:

+0

'return '' .join (mRNA_parts [нуклеотид] для нуклеотида в кодировании_strand) .upper()' –

+0

@BurhanKhalid Я подумал об этом, но я подумал, что лучше всего объяснить это простым способом. Однако я включу это. –

+1

Да, построение строки путем повторной конкатенации является субоптимальным и может вызвать серьезные проблемы с производительностью на некоторых платформах. 'str.join()' и [понимание списка] (http://www.youtube.com/watch?v=pShL9DCSIUw) - лучшее решение. –

Смежные вопросы