Skip to main content
 首页 » 编程设计

python循环字典值引用更新所有值

2025年05月04日11三少

我在更新 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”级别都会更新为相同的值。我不太会用字典,我也看不出我的方法有什么错误,但它们很深奥!谁能赐教一下?

希望我已经说得足够清楚了。我已经修改这段代码太久了:(

请您参考如下方法:

忏悔 -- 我没有花时间弄清楚你的所有代码 -- 只有第一部分。您遇到的第一个问题是在设置中:

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() 

-- 我决定使用一个函数来使其更易于阅读:)。