私は割り当てで私のガールフレンドを手伝っています。この割り当ての一部は、特定のワイルドカード文字を含む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での経験はあまりありませんが、私はこの質問に対する答えをオンラインで見つけることができませんでした。
ありがとうございました!
これはあなたの問題の直接の原因であるかどうかは知りませんが、それは確かに修正する価値がある:あなたのラインの一部は、スペースでインデントされ、そしていくつかは、タブでインデントされています。特に、 'd = {}'、 'd.update({name:pos})'、 'return d'はすべてタブ付きです。字下げスタイルを混在させると、言語パーサが混乱し、奇妙な動作が発生する可能性があります。スペースを使ってこれらの行のそれぞれを再インデントすることをお勧めします。 – Kevin
'short'または' long'が空の場合(それらが何であれ)、 'pos_seq'の' for'ループは実行されず、 'd'は空のdictのままです。 – DeepSpace
全く関係はありませんが、IUPAC.keys()の 'ltr 'を' IUPACのifr'に置き換えたいと思っています - それはもっと速くです。また、 'd.update()'はまったく呼び出す必要はありません。添字構文 'd [name] = pos'を使うことができます。これはあなたの問題を実際に解決するものではありませんが、よく... –