当数据具有现有键时更新嵌套字典

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

【讨论】:

以上是关于当数据具有现有键时更新嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

从嵌套字典创建单个字典以更新 MySQLdb

如何在嵌套的 Python 字典中搜索匹配的数据框值,然后更新数据框?

Boto3 S3 更新现有对象的元数据

当我在循环中添加到字典时有新键时创建一个新列表

遍历现有键并更新字典python

如何更新嵌套字典中键的值?