数据具有现有密钥时更新嵌套字典

时间:2014-11-25 04:12:34

标签: python python-2.7 dictionary nested

我正在尝试更新嵌套字典中的值,而不会在密钥已存在时覆盖以前的条目。 例如,我有一本字典:

  myDict = {}
  myDict["myKey"] = { "nestedDictKey1" : aValue }

给予,

 print myDict
>> { "myKey" : { "nestedDictKey1" : aValue }}

现在,我想在"myKey"

下添加另一个条目
myDict["myKey"] = { "nestedDictKey2" : anotherValue }}

这将返回:

print myDict
>> { "myKey" : { "nestedDictKey2" : anotherValue }}

但我想:

print myDict
>> { "myKey" : { "nestedDictKey1" : aValue , 
                 "nestedDictKey2" : anotherValue }}

有没有办法更新或追加"myKey"新值,而不会覆盖以前的值?

5 个答案:

答案 0 :(得分:12)

这是一个非常好的general solution to dealing with nested dicts

import collections
def makehash():
    return collections.defaultdict(makehash)

允许在任何级别设置嵌套键:

myDict = makehash()
myDict["myKey"]["nestedDictKey1"] = aValue
myDict["myKey"]["nestedDictKey2"] = anotherValue
myDict["myKey"]["nestedDictKey3"]["furtherNestedDictKey"] = aThirdValue

对于单级嵌套,defaultdict可以直接使用:

from collections import defaultdict
myDict = defaultdict(dict)
myDict["myKey"]["nestedDictKey1"] = aValue
myDict["myKey"]["nestedDictKey2"] = anotherValue

这里只使用dict

try:
  myDict["myKey"]["nestedDictKey2"] = anotherValue
except KeyError:
  myDict["myKey"] = {"nestedDictKey2": anotherValue}

答案 1 :(得分:7)

您可以使用collections.defaultdict,只需在嵌套字典中设置键值对。

from collections import defaultdict
my_dict = defaultdict(dict)
my_dict['myKey']['nestedDictKey1'] = a_value
my_dict['myKey']['nestedDictKey2'] = another_value

或者,您也可以将最后两行写为

my_dict['myKey'].update({"nestedDictKey1" : a_value })
my_dict['myKey'].update({"nestedDictKey2" : another_value })

答案 2 :(得分:1)

您可以编写一个生成器来更新嵌套字典中的键,就像这样。

def update_key(key, value, dictionary):
        for k, v in dictionary.items():
            if k == key:
                dictionary[key]=value
            elif isinstance(v, dict):
                for result in update_key(key, value, v):
                    yield result
            elif isinstance(v, list):
                for d in v:
                    if isinstance(d, dict):
                        for result in update_key(key, value, d):
                            yield result

list(update_key('Any level key', 'Any value', DICTIONARY))

答案 3 :(得分:0)

myDict["myKey"]["nestedDictKey2"] = anotherValue

myDict["myKey"]返回嵌套字典,我们可以像添加任何字典一样添加另一个键:)

示例:

>>> d = {'myKey' : {'k1' : 'v1'}}
>>> d['myKey']['k2'] = 'v2'
>>> d
{'myKey': {'k2': 'v2', 'k1': 'v1'}}

答案 4 :(得分:0)

您可以将嵌套的dict视为不可变的:

myDict["myKey"] = dict(myDict["myKey"], **{ "nestedDictKey2" : anotherValue })