2017-01-19 3 views
-4

文字列入力(この場合はDNAコドンシーケンス)を行い、シーケンス内の対応するSLCを出力として出力する必要があります(例:ATT出力:I )。私の現在のコードではこれを達成することができますが、3で割り切れる長さではないシーケンス(例えば、入力:ATTOP出力:IX)に対しては 'X'を出力するようにしたいと考えています。複数の行とは対照的に一列に印刷される上記ためPythonで3つの文字列の繰り返しを改善する

DNA = 'GTTATCTTTPY' 

def translate(DNA): 
    if DNA == 'ATT' or DNA == 'ATC' or DNA == 'ATA': 
     print 'I' 
    elif DNA == 'CTT' or DNA == 'CTC' or DNA == 'CTA' or DNA =='CTG' or DNA == 'TTA' or DNA == 'TTG': 
     print 'L' 
    elif DNA == 'GTT' or DNA == 'GTC' or DNA == 'GTA' or DNA == 'GTG': 
     print 'V' 
    elif DNA == 'TTT' or DNA == 'TTC': 
     print 'F' 
    elif DNA == 'ATG': 
     print 'M' 
    else : 
     print "X" 

for i in range(3, len(DNA) + 1, 3): 
    translate (DNA[i-3:i]) 

出力は:

V Iは F

をので、私は 'PYは' X」として出力することを希望します'他のステートメントではなく、3で割り切れる長さではありません。また、出力は次のようになります:VIFX。

+0

を使用することをお勧めしますがif..elif – depperm

+0

後にそれをすることをを印刷し、文字列に文字を追加することができますインプットの例、現在得られているアウトプット、そしてあなたが期待しているアウトプットを提供した場合に役立ちます。 – Tagc

+0

編集@Tagcを参照してください – Zambo004

答えて

1

あなたが得るbiopythonhttp://biopython.org/

from Bio.Seq import Seq 
seq = Seq('GTTATCTTT') 
print(seq.translate()) 

VIF 
1

まず、1つの出力文字に接続されているすべての可能性をリストに入れて、DNA変数がinのリストかどうかをチェックする方が良いでしょう。それはちょっと美しく見えます。

それは次のようになります。あなたが1行のすべての文字を持っているしたい場合は、たとえば、変数を使用して、単にそれに文字を追加することができ

if DNA == 'ATT' or DNA == 'ATC' or DNA == 'ATA': 
    print 'I' 

if DNA in ['ATT', 'ATC', 'ATA']: 
    print 'I' 

の代わりに、 DNAコード全体を解析した後に印刷してください。

def translate(DNA): 
    output = '' 

    if DNA in ['ATT', 'ATC', 'ATA']: 
     output += 'I' 
    ... 

「X」あなたが3つの未満の文字または任意の他の組み合わせを得るとき、それはwhileループを使用するために、おそらくより良いですが印刷されます。

あなたのコードは、例えばそのようになります。あなただけの結果を得るためにあなたの関数に引数を与えなければなりません

def translate(DNA) 
    output = '' 
    while DNA: #it's the same as while DNA != '' 
     three_letters = DNA[:3] #you should come up with better name ;) 
     DNA=DNA[3:]# in Python 3 this works even if DNA has less than 3 letters, hope it works in Python 2 too 
     if three_letters in ['ATT', 'ATC', 'ATA']: 
      output += 'I' 
     ... #here code all elifs and else inside while loop 

    print output 

そうすれば、外部forループや、そのようなは必要ありません。

0

多くの場合、データ駆動型のものがよくあります。これは、デバッグやメンテナンスを簡単にするためです。このため

xlate_map = { 
    'I': ('ATT', 'ATC', 'ATA'), 
    'L': ('CTT', 'CTC', 'CTA', 'CTG', 'TTA', 'TTG'), 
    'V': ('GTT', 'GTC', 'GTA', 'GTG'), 
    'F': ('TTT', 'TTC'), 
    'M': ('ATG') 
} 

# build a translation table from mapping 
xlate_table = {} 
for code, values in xlate_map.items(): 
    for value in values: 
     xlate_table[value] = code 

def grouper(n, sequence): 
    """s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ...""" 
    for i in xrange(0, len(sequence), n): 
     yield sequence[i:i+n] 

def translate(DNA): 
    res = (xlate_table.get(seq, 'X') for seq in grouper(3, DNA)) 
    return ''.join(res) 

print(translate('GTTATCTTTPY')) # -> VIFX 
+0

これはあなたの望むものとまったく同じですか? – martineau

関連する問題