V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lanceadd
V2EX  ›  问与答

python3 多个多层 dict 合并

  •  
  •   lanceadd · 2020-12-07 21:02:44 +08:00 · 1015 次点击
    这是一个创建于 1240 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位老哥我想问下在 python3 中,我有两个多层 dict,怎么合并他们 例如这种,谢谢老哥们

    {
    	user_id:{
        	title_id:{
            	relation_id:{
                	reviewer_id:rate
                }
            }
        }
    }
    
    5 条回复    2020-12-08 09:47:04 +08:00
    renmu123
        1
    renmu123  
       2020-12-07 21:14:41 +08:00 via Android
    不知道你所谓的合并两个 dict 是什么操作,你给了个例子(例子也不完整),但是没有给出应该呈现的结果
    westoy
        2
    westoy  
       2020-12-07 21:15:31 +08:00
    你给案例别给一半啊.....
    lanceadd
        3
    lanceadd  
    OP
       2020-12-07 22:19:47 +08:00
    @renmu123 @westoy 抱歉抱歉我也不知道为啥会缺了一块, 发布前预览是没问题的, 另外一个 dict 也是这个,但是 user_id,title_id 这些 key 可能不相同,然后可能层级也不一样,可能会只有两层那种,然后想把一个 dict,update 到另外一个 dict 上,如果那一层的 key 相同 value 不同就合并上去,举个例子按照我上面那个结构,user_id 、title_id 相同但是 relation_id 不同,怎么把它俩合并起来,我原本以为 dict.update()就好了,但是发现对多层的 dict 直接 update 会直接覆盖,然后发现只能一层一层的 update,就很尴尬,除了递归还有啥办法可以更新不同深度的嵌套字典的值吗
    lanceadd
        4
    lanceadd  
    OP
       2020-12-07 22:47:25 +08:00
    多个嵌套字典合并为一个
    lanceadd
        5
    lanceadd  
    OP
       2020-12-08 09:47:04 +08:00
    解决了
    ```
    def recursive_update(
    default: dict,
    custom: dict
    ):
    """
    递归更新 dict
    :param default:
    :param custom:
    :return:
    """
    if not isinstance(default, dict) or not isinstance(custom, dict):
    raise TypeError('Params of recursive_update should be dicts')

    for key in custom:
    if isinstance(custom[key], dict) and isinstance(default.get(key), dict):
    default[key] = recursive_update(default[key], custom[key])
    else:
    default[key] = custom[key]

    return default
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1730 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:22 · PVG 00:22 · LAX 09:22 · JFK 12:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.