You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中对两个嵌套哈希映射对应值求和的高效方法咨询

如何高效合并两个嵌套哈希表并对应值相加?

问题背景

我有两个嵌套的哈希表(Python字典):

m1 = {}
m1['a'] = {}
m1['b'] = {}
m1['a']['x'] = 5
m1['b']['x'] = 6
m1['a']['y'] = 4
m1['b']['y'] = 6

m2 = {}
m2['a'] = {}
m2['b'] = {}
m2['a']['x'] = 8
m2['b']['x'] = 7
m2['a']['y'] = 6
m2['b']['y'] = 4

期望合并后得到m3,其中对应键的值相加:

  • m3['a']['x'] = 13
  • m3['a']['y'] = 10
  • m3['b']['x'] = 13
  • m3['b']['y'] = 10

目前我已经实现了逐个遍历两个哈希表、将值相加到新哈希表的简单方案,但想知道是否有更高效、更简洁的实现方式?


高效实现方案

嘿,这个问题挺常见的!你的基础遍历方案完全可行,但我们可以利用Python的字典特性来让代码更简洁,同时保持甚至提升效率,分两种场景给你推荐方案:

场景1:确定两个字典结构完全一致

如果能保证m1和m2的外层、内层键都一一对应(就像你给出的示例那样),用嵌套字典推导式是最简洁高效的方式,一行代码就能搞定:

m3 = {
    outer_k: {
        inner_k: m1[outer_k][inner_k] + m2[outer_k][inner_k]
        for inner_k in m1[outer_k]
    }
    for outer_k in m1
}

这种写法省去了手动创建空字典、逐个赋值的繁琐,底层的遍历逻辑和手动循环完全一致,效率没差别,但代码可读性和简洁度提升不少。

场景2:需要兼容键结构不一致的情况

如果不确定两个字典的键是否完全匹配(比如某个外层键只在m1里存在,或者内层键有缺失),那就需要一个更通用的递归方案,能自动处理所有嵌套层级和键的差异:

def merge_and_sum(dict1, dict2):
    merged = {}
    # 拿到所有存在的键,避免遗漏
    all_keys = set(dict1.keys()).union(dict2.keys())
    
    for key in all_keys:
        val1 = dict1.get(key, {})
        val2 = dict2.get(key, {})
        
        # 如果都是字典,递归合并;否则直接相加(默认缺失的键对应值为0)
        if isinstance(val1, dict) and isinstance(val2, dict):
            merged[key] = merge_and_sum(val1, val2)
        else:
            # 处理非字典的情况,把空字典视为0
            num1 = val1 if not isinstance(val1, dict) else 0
            num2 = val2 if not isinstance(val2, dict) else 0
            merged[key] = num1 + num2
    return merged

m3 = merge_and_sum(m1, m2)

这个方案不仅能处理你当前的两层嵌套,哪怕是更深的嵌套结构也能轻松应对,容错性更强,唯一的小开销是递归调用,但对于大多数场景来说完全可以忽略。

效率对比

  • 固定结构下,字典推导式和手动遍历的效率几乎没有差别,但代码更简洁。
  • 递归方案虽然多了点函数调用的成本,但换来了极强的通用性,适合不确定输入结构的场景。

内容的提问来源于stack exchange,提问作者JenuRudan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:35:31