2016-12-27 2 views
0

私は割り当てで私のガールフレンドを手伝っています。この割り当ての一部は、特定のワイルドカード文字を含むDNA配列内の可能な組み合わせの数の計算です。関数内の辞書を更新する

私は次のPythonスクリプトを使用しています:

from Bio import Seq 
from Bio import SeqIO 

short = SeqIO.parse('short.fasta', 'fasta') 
long = SeqIO.parse('long.fasta', 'fasta') 

# IUPAC dictionary 

IUPAC = { 
    'R': 2, 
    'Y': 2, 
    'S': 2, 
    'W': 2, 
    'K': 2, 
    'M': 2, 
    'B': 3, 
    'D': 3, 
    'H': 3, 
    'V': 3, 
    'N': 4 
} 

# Define method to count number of possible sequences 
def pos_seq(seqs): 
    d = {} 

    for record in seqs: 
     pos = 1  
     name = record.id 
     seq = record.seq 

     for ltr in seq: 
      if ltr in IUPAC.keys(): 
       pos = pos * IUPAC[ltr] 

     d.update({name : pos}) 
     print(name + ": " + str(pos) + " possibilities") 
     print("") 

    print("end of file") 
    print("") 

    return d 



print(pos_seq(short)) 
print(pos_seq(long)) 

pos_seqはシーケンスの集合を取り込み、シーケンスのそれぞれについて、可能性の数を返す関数。

スクリプトは正常に機能し、関数は各反復で正しい答えを出力します。しかし、シーケンスの名前と可能性の数を辞書に保存して返したいと思っていました。

問題は次のとおりです。空の辞書(メソッドの最初に定義されているように)が常に返されます。

ディクショナリをグローバルに(関数外で)定義すると機能します。辞書は正しく更新されるので、関数内で辞書を定義している可能性があります。たぶん、.update行を変更して、更新したい辞書をグローバル辞書でないと指定する必要がありますか?

私は辞書を作成し、それを数回更新してから返す関数を使うことはできないようです。それは空のままです。

私はPythonでの経験はあまりありませんが、私はこの質問に対する答えをオンラインで見つけることができませんでした。

ありがとうございました!

+3

これはあなたの問題の直接の原因であるかどうかは知りませんが、それは確かに修正する価値がある:あなたのラインの一部は、スペースでインデントされ、そしていくつかは、タブでインデントされています。特に、 'd = {}'、 'd.update({name:pos})'、 'return d'はすべてタブ付きです。字下げスタイルを混在させると、言語パーサが混乱し、奇妙な動作が発生する可能性があります。スペースを使ってこれらの行のそれぞれを再インデントすることをお勧めします。 – Kevin

+1

'short'または' long'が空の場合(それらが何であれ)、 'pos_seq'の' for'ループは実行されず、 'd'は空のdictのままです。 – DeepSpace

+0

全く関係はありませんが、IUPAC.keys()の 'ltr 'を' IUPACのifr'に置き換えたいと思っています - それはもっと速くです。また、 'd.update()'はまったく呼び出す必要はありません。添字構文 'd [name] = pos'を使うことができます。これはあなたの問題を実際に解決するものではありませんが、よく... –

答えて

1

(インデントエラーにもかかわらず、引き上げ一切インデントエラー)が発生ジェズない不可解な問題の研究のビットの後、私はあなたのコードが動作する理由ことがわかりました。

8個のスペースとタブで一貫してインデントしていました。これは、Python 2で許可されますがPythonで許可されていない3 http://python3porting.com/differences.html#indentation

のPython 2ではタブは、インデントなど8つのスペースに等しくなりますので、あなたは一つのタブとライン、および8で次の行をインデントすることができますスペース。 Pythonの3タブで

は、別のタブにのみ等しくなります。これは、各字下げレベルがタブとスペースの使用において一貫していなければならないことを意味します。

したがって、あなたはこのコードをしようとした場合:

print("Hello world!") 
def my_func(x): 
     print(x) 
    print(x) 

これは、Python 2で動作しますが、StackOverflowの程度に注意することが

のPython 3でもう一つのインデントエラーが発生しますことも、I見つけたあなたがそれらでインデントでコードを貼り付けるときに表示されたとき、それは4つのスペースとして表示されますが、あなたが編集モードに入るとき、あなたはコピーして、タブを(それを試してみてください)貼り付けることができるようになりますということです。

そのため、エラーがまだあってもコードが機能しません。