2016-10-08 4 views
0

シーケンス「ADFG」を持っているとします。 スクリプトはリスト(A、T、G、C)に含まれているかどうかを確認し、そうであれば辞書からキーを取得して1を追加します。 したがって、シーケンス "ADFG"では、変数 "a"と変数 "g"に1を加え、変数 "error"に2を追加します。 しかし、スクリプトがエラーを返していない間、dicio [i] + = 1行は何も追加していません.... これを行うための簡単な方法がありますが、私は辞書を使いたいと思います。辞書カウンター

seq= input ("dna seq:").upper() 
a,t,g,c,error=0,0,0,0,0 
dicio= {"A":a,"T":t,"G":g,"C":c} 
for i in seq: 
    if i in ("A","T","G","C"): 
     dicio[i]+=1 
     a+=1 
    else: 
     error+=1 

print("A={:.2f} %".format(a/len(seq)*100)) 
print("T={:.2f} %".format(t/len(seq)*100)) 
print("G={:.2f} %".format(g/len(seq)*100)) 
print("C={:.2f} %".format(c/len(seq)*100)) 
print("Da sequencia,{:.2f} % sao erros".format(error/len(seq)*100)) 
+0

あなたは、このような 'A'や' G'ような単純な変数を変更するには、辞書の割り当てを使用することはできません –

+0

プログラミング言語タグを追加します。ここでは、もう少し簡潔にするために、いくつかの辞書機能を使用して、いくつかのコードです。以下のように 'dicio ['A']'と 'dicio ['G']'を使用してください。 –

答えて

0

あなたがそのT、G、Cの意味は、通常だdicio

に追加することで影響を受けません:辞書には、変数の参照を取るが、ちょうど初期値をコピーしていません。辞書の値に1を追加すると、それらは更新されません。 (aはコード内で特別なケースですが、すべてのケースで更新されますが、残りのコードと少なくとも論理的には異なるバグかもしれません)。あなたが欲しいもの

を行うには、あなたは自分のt,g ...変数と結果を表示するdicioを使用し忘れるする必要があります(

for i in ("A","T","G","C"): 
    print("{}={:.2f} %".format(i,dicio[i]/len(seq)*100)) 

ボーナスとして、あなたは/コピーの多くを保存しますBTW):)

を貼り付けます。

from Collections import ordereddict 

dicio = ordereddict() 
for k in ("A","T","G","C"): 
    dicio[k] = 0 
+0

私は、Pythonが特定の順序を出力していることに気付きました。 ようなので: T = 20.51パーセント C = 28.21パーセント G = 20.51パーセント A = 30.77パーセント どのように順序を定義することができますか?これは辞書の順序に従っていないので、これは奇妙に思えます... –

+0

私の編集を参照してください。辞書はキーの並べ替えを保証しません。 'ordereddict'が必要なものです。 –

0

私は思う:あなたは辞書を初期化し、キ​​ーを維持したい場合は、ordereddictを必要と命じました値を格納する代わりに辞書を使用して、a,t,g,cを接続して同時に更新しようとしています。

seq= input ("dna seq:").upper() 
a,t,g,c,error=0,0,0,0,0 
dicio= {"A":a,"T":t,"G":g,"C":c} 
for i in seq: 
    if i in dicio.keys(): 
     dicio[i]+=1 
    else: 
     error+=1 

for key,value in dicio.items(): 
    print("{}={:.2f} %".format(key,value/len(seq)*100)) 

print("Da sequencia,{:.2f} % sao erros".format(error/len(seq)*100))