-3

DNAをRNAに翻訳する簡単なプログラムを書きました。基本的に、文字列を入力すると、文字列が文字に分割されてリストに送信され、文字がシフトされ、結果のリストから文字列が返されます。このプログラムは、a を u に、そして to を a に正しく変換しますが、g を c に、c を g に変換しません。

これはプログラムです:

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)

この奇妙な動作が発生するのはなぜですか?どうすれば解決できますか?

4

2 に答える 2

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()代わりに使用してください。

于 2013-02-23T18:40:49.313 に答える
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

通常、DNA/RNA のヌクレオチドは大文字で書かれるため、大文字で返されます。

私もあなたの方法を修正しました...インデックス自体を反復する方が良いです。その後、する必要はありません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()])

参考文献:

于 2013-02-23T18:42:11.333 に答える