增加嵌套python dict中的项目

时间:2014-01-14 11:02:20

标签: python dictionary

我有一个嵌套的Python Dict,我试图从列表中获取值,然后将它们迭代到Dict的值中:

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

但是,当我打印我的dict时,它似乎是将所有增量添加到所有Dict条目中。我的意思是代替这个:

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

我得到了这个:

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

我有点难过。

编辑: 这就是Dicts的创建方式: 我首先浏览一个包含类型分类的长表。在我这样做的时候,我在主Dict中创建了一个新的条目。同时,我将所有独特的分类收集到一个subDict中,以便稍后我可以将它添加到主Dict中:

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并将其插入主Dict,没有意识到插入的subDict保留了它与原始subDict对象的关系:

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

解: 根据下面的正确答案,我通过添加.copy()

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

1 个答案:

答案 0 :(得分: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()