我正在寻找一种使用dict update内容更新dict dictionary1的方法
dictionary1={'level1':{'level2':{'levelA':0,'levelB':1}}}
update={'level1':{'level2':{'levelB':10}}}
dictionary1.update(update)
print dictionary1
{'level1': {'level2': {'levelB': 10}}}
我知道update会删除level2中的值,因为它正在更新最低的密钥level1。
鉴于dictionary1和update可以有任何长度,我该如何解决?
@FM的答案具有正确的总体思路,即递归解决方案,但有些特殊的编码和至少一个错误。我建议改为:
Python 2:
import collections
def update(d, u):
for k, v in u.iteritems():
if isinstance(v, collections.Mapping):
d[k] = update(d.get(k, {}), v)
else:
d[k] = v
return d
Python 3:
import collections.abc
def update(d, u):
for k, v in u.items():
if isinstance(v, collections.abc.Mapping):
d[k] = update(d.get(k, {}), v)
else:
d[k] = v
return d
该错误显示当“更新”拥有了k
,v
项目在那里v
是dict
和k
最初不是被更新在字典中的关键- @
FM代码“跳过”更新的这一部分(因为它执行它的新的空dict
其没有保存或任何返回,只是失去了递归调用返回时)。
我的其他更改很小:没有理由让if
/else
构造何时.get
更快,更干净地完成相同的工作,并且isinstance
出于一般性考虑,最好将其应用于抽象基类(而不是具体的基类)。
我有一个深度嵌套的文档结构,如下所示: 我正在尝试更新集合以插入新配置,如下所示: 我正在mongo(Python)中尝试类似的内容: 但是,我得到了“如果没有包含数组的相应查询字段,则无法应用位置运算符”错误。在mongo这样做的正确方式是什么?这是mongo v2。4.1.
问题内容: 我的应用程序中有一个非常复杂的数据结构,需要对其进行操作。我试图跟踪玩家在他们的花园中有多少种错误。有十种错误,每种错误都有十种模式,每种模式都有十种颜色。所以可能有1000个独特的错误,我想追踪玩家每种类型的错误数量。嵌套的字典如下所示: 我没有使用此语法的任何错误或投诉。 当我想增加播放器的错误收集时,请执行以下操作: 我收到此错误: 字符串不能转换为’DictionaryInde
问题内容: 我已经从网站下载了json数据,我想从嵌套的json中选择特定的key:values。我将json转换为python字典。然后,我使用字典理解来选择嵌套的key:values,但是嵌套太多了,我相信有比单独扩展每个字典更好的方法。我在我的方法中看到了冗余。您能建议一个更好的方法吗? 我的方法: 从datetime导入datetime,timedelta 问题答案: 我建议您使用,具有完
问题内容: 我已经从网站下载了json数据,我想从嵌套的json中选择特定的key:values。我将json转换为python字典。然后,我使用字典理解来选择嵌套的key:values,但是嵌套太多了,我相信有比单独扩展每个字典更好的方法。我在我的方法中看到了冗余。您能建议一个更好的方法吗? 我的方法: 从datetime导入datetime,timedelta 问题答案: 我建议您使用,具有完
问题内容: 我正在构建一些Python代码来读取和操作深层嵌套的dict(最终是为了与JSON服务进行交互,但是,将其用于其他用途将非常有用)我正在寻找一种方法,可以轻松地在内部深层读取/设置/更新值dict,不需要很多代码。 @另请参阅Python:通过属性以及索引访问来递归访问dict?-Curt Hagenlocher的“ DotDictify”解决方案非常雄辩。我也喜欢Ben Alman在
我正在努力编写一本嵌套非常多的词典。只有当字典中有“name”:“bingo”时,我才需要获取字典的“main_id”。 我有解决办法,但在我看来是相当丑陋的。 我想知道: 有更好更干净的方法来实现它(总是;)