当数据具有现有键时更新嵌套字典
Posted
技术标签:
【中文标题】当数据具有现有键时更新嵌套字典【英文标题】:Updating nested dictionaries when data has existing key 【发布时间】:2015-01-22 23:35:12 【问题描述】:我正在尝试更新嵌套字典中的值,而不是在键已经存在时覆盖以前的条目。 例如,我有一本字典:
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"
,而不覆盖以前的值?
【问题讨论】:
【参考方案1】:这是一个非常好的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
【讨论】:
【参考方案2】:您可以为此使用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 )
【讨论】:
【参考方案3】:你可以编写一个生成器来更新嵌套字典中的键,就像这样。
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))
【讨论】:
【参考方案4】:您可以将嵌套的 dict 视为不可变的:
myDict["myKey"] = dict(myDict["myKey"], ** "nestedDictKey2" : anotherValue )
【讨论】:
我认为这是最简洁的解决方案【参考方案5】:myDict["myKey"]["nestedDictKey2"] = anotherValue
myDict["myKey"]
返回嵌套字典,我们可以向其中添加另一个键,就像我们为任何字典所做的那样:)
例子:
>>> d = 'myKey' : 'k1' : 'v1'
>>> d['myKey']['k2'] = 'v2'
>>> d
'myKey': 'k2': 'v2', 'k1': 'v1'
【讨论】:
【参考方案6】:我自己写了一个函数来解决这个问题
def updateDict2keys(myDict,mykey1,mykey2,myitems):
"""
updates a dictionary by appending values at given keys (generating key2 if not already existing)
input: dictionary, key1, key2 and items to append
output: dictionary orgnanized as mykey1:mykey2:myitems
"""
myDict.setdefault(mykey1, )[mykey2] = myitems
return myDict
【讨论】:
以上是关于当数据具有现有键时更新嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章