3

Python で辞書の値を更新する際に問題が発生しています。単一の最初のレベルのキーのネストされた値 (int またはリストとして) を更新しようとしていますが、代わりにすべての最初のレベルのキーの値を更新します。

まず、辞書を作成します。

kmerdict = {}
innerdict = {'endcover':0, 'coverdict':{}, 'coverholder':[], 'uncovered':0, 'lowstart':0,'totaluncover':0, 'totalbases':0}
for kmer in kmerlist: # build kmerdict
    kmerdict [kmer] = {}
    for chrom in fas:  #open file and read line
        chromnum = chrom[3:-3]
        kmerdict [kmer][chromnum] = innerdict

次に、リスト (fas、表示されていません) から染色体 (プレーン テキスト ファイルとして) をたどり、7mer 文字列 (k=7) をキーとして取得します。そのキーが探しているキーのリストにある場合 (kmerlist)、それを使用して、辞書にネストされた単一の値を参照しようとしています。

for chrom in fas:  #open file and read line
    chromnum = chrom[3:-3]
    p = 0  #chromosome position counter
    thisfile = "/var/store/fa/" + chrom
    thischrom = open(thisfile)
    thischrom.readline()
    thisline = thischrom.readline()
    thisline = string.strip(thisline.lower())
    l=0  #line counter
    workline = thisline
    while(thisline):
        if len(workline) > k-1:
            thiskmer = ''
            thiskmer = workline[0:k] #read five bases
            if thiskmer in kmerlist:
                thisuncovered = kmerdict[thiskmer][chromnum]['uncovered']
                thisendcover =  kmerdict[thiskmer][chromnum]['endcover']
                thiscoverholder = kmerdict[thiskmer][chromnum]['coverholder']
                if p >= thisendcover:
                    thisuncovered += (p - thisendcover)
                    thisendcover = ((p+k) + ext)
                    thiscoverholder.append(p)
                elif p < thisendcover:
                    thisendcover = ((p+k) + ext)
                    thiscoverholder.append(p)
            print kmerdict[thiskmer]
            p += 1
            workline = workline[1:]
        else:
            thisline = thischrom.readline()
            thisline = string.strip(thisline.lower())
            workline = workline+thisline
            l+=1
print kmerdict

しかし、辞書を印刷すると、すべての「thiskmer」レベルが同じ値で更新されます。私は辞書が苦手で、自分のやり方に間違いは見当たりませんが、辞書は奥深いものです。誰でも私を啓発できますか?

私が十分に明確であることを願っています。私はあまりにも長い間このコードをいじっています:(

4

1 に答える 1

1

自白-- 私はあなたのコードのすべてを理解するのに時間を費やしたわけではありません -- 最初の部分だけです。最初の問題はセットアップにあります。

kmerdict = {}
innerdict = {'endcover':0, 'coverdict':{}, 'coverholder':[], 'uncovered':0, 
             'lowstart':0,'totaluncover':0, 'totalbases':0}
for kmer in kmerlist: # build kmerdict
    kmerdict [kmer] = {}
    for chrom in fas:  #open file and read line
        chromnum = chrom[3:-3]
        kmerdict [kmer][chromnum] = innerdict

innerdict一度作成してから、同じ辞書を何度も繰り返し使用します。つまり、everykmerdict[kmer][chromnum]は同じオブジェクトを参照します。おそらく最後の行を次のように変更します。

kmerdict [kmer][chromnum] = copy.deepcopy(innerdict)

copy(ファイルの上部にある適切なインポートで)役立ちますか?innerdictまたは、コメントで指摘されているように、の作成を内側のループに移動することもできます。

def get_inner_dict():
    return {'endcover':0, 'coverdict':{}, 'coverholder':[], 'uncovered':0, 
            'lowstart':0,'totaluncover':0, 'totalbases':0}

kmerdict = {}
for kmer in kmerlist: # build kmerdict
    kmerdict [kmer] = {}
    for chrom in fas:  #open file and read line
        chromnum = chrom[3:-3]
        kmerdict [kmer][chromnum] = get_inner_dict()

-- 読みやすくするために関数を使用することにしました :)。

于 2013-02-11T02:51:05.930 に答える