我正在尝试更新嵌套字典中的值,而不会在密钥已存在时覆盖以前的条目。 例如,我有一本字典:
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"
新值,而不会覆盖以前的值?
答案 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 })