2013-02-11 92 views
1

我在更新python字典中的值時遇到問題。我試圖更新一個嵌套的值(無論是作爲一個int或列表)爲一個拳頭級別的關鍵,而是我更新的值,所有第一級別的關鍵。python循環字典值引用更新所有值

我開始通過創建字典:從列表

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,未示出),並採取7聚體字符串(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」水平正在更新相同的值。我對字典不太擅長,我也看不到我的方式錯誤,但他們是深刻的!任何人都可以啓發我嗎?

希望我已經清楚了。我一直在修改這段代碼太久了:(

回答

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一次,然後繼續反覆使用相同的字典過的。換句話說,每個kmerdict[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() 

- 我決定使用的功能,使其更容易閱讀:)。

+0

+1。或者將'innerdict'移到內部循環中。 – unutbu 2013-02-11 02:55:44

+0

@unutbu - 是的,這將是一個更明智的修復不是嗎?我猜,今天鏟了太多的雪。 – mgilson 2013-02-11 02:57:17

+0

硬背,但很好的睡眠。保持溫暖:) – unutbu 2013-02-11 02:59:02