当前位置: 首页 > 面试题库 >

更新嵌套深度不同的字典的值

翟理
2023-03-14
问题内容

我正在寻找一种使用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

该错误显示当“更新”拥有了kv项目在那里vdictk最初不是被更新在字典中的关键- @
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”。 我有解决办法,但在我看来是相当丑陋的。 我想知道: 有更好更干净的方法来实现它(总是;)