gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:16 25 4
gpt4 key购买 nike

我在更新 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()

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

关于python循环字典值引用更新所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14805203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com