2014-01-14 61 views
0

我有一个嵌套的Python字典,我试图从列表中取值,然后遍历他们进入一个快译通的值,例如:增量项目

for row in rows: 
    Dict[A][AA][AAA] += 1 

然而,当我打印我的字典,它似乎是将所有增量添加到所有的Dict条目中。我的意思是,与其这样:

{KeyA:{KeyAA:{KeyAAA:5}}} 
{KeyB:{KeyBB:{KeyBBB:10}}} 

我得到这个:

{KeyA:{KeyAA:{KeyAAA:15}}} 
{KeyB:{KeyBB:{KeyBBB:15}}} 

我有点难倒。

编辑: 这是如何创建的字典: 我第一次通过一个包含类型分类的长表浏览。当我这样做时,我创建了一个新的主词典。与此同时,我收集所有的独特分类成subDict,这样我可以补充这主要快译通以后:

Dict = {} 
subDict = {} 
for row in skimRows: 
    Dict[row[0]] = {"Type":row[1],"Assoc":{}} # Save each ID and origin Type to Dict 
    if item not in subDict: # Check to see if unique item already exists in subDict 
    subDict[item] = 0 

这显然是我要去哪里错了。当时我走的是subDict和plunking到主快译通这一点,并没有意识到插入subDict被保留了其原来的subDict对象关系:

for key in Dict: # After initial iteration and Type collection, add new subDict to each Dict key 
    Dict[key]["Assoc"] = subDict 

SOLUTION: 每下面的正确答案,我通过增加固定它.copy()

for key in Dict: # After initial iteration and Type collection, add new subDict to each Dict key 
    Dict[key]["Assoc"] = subDict.copy() 
+2

你与*相同的字典*创建了嵌套的词典,它们是同一个对象的所有引用。你是如何创建这个结构的? –

+0

你能告诉我们你的示例代码,这样我们可以看到什么是错的 – duck

+0

'row'怎么从未用过for块? – astreal

回答

1

你内心的字典都是共享的,不是唯一的目标:

>>> somedict = {} 
>>> somedict['foo'] = {'bar': 0} 
>>> somedict['spam'] = somedict['foo'] 
>>> somedict['foo']['bar'] += 1 
>>> somedict['spam'] 
{'bar': 1} 
>>> somedict['foo'] is somedict['spam'] 
True 

两个关键foospam这两个在这里指的是同一个对象,一个字典对象持有密钥bar

您不应该重复使用这样的字典。可以创建一个新的空dictiorary:

somedict['spam'] = {'bar': 0} 

或创建(浅)复制:

somedict['spam'] = somedict['foo'].copy()