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

如何实现两个Python嵌套字典的合并/相加操作?

合并嵌套字典的分步解决方案

嘿,这个问题我之前处理过,嵌套字典的合并得针对不同字段的逻辑来,咱们一步步拆解搞定它!

首先得明确咱们的合并规则(毕竟不同场景需求可能不一样,这里先按最合理的逻辑来):

  • 对于外层相同的键(比如1009):
    • amount_spent:直接把两个字典里的数值相加
    • size:同样直接相加(代表总用户数)
    • Avg:不能直接加原来的平均值,得用总花费除以总用户数来重新计算(或者用加权平均,这个后面会提)
    • users:把两个字典里的所有用户ID合并到一起,重新生成连续的序号键(避免原序号重复的问题)

代码实现

这里直接写一个可复用的函数,把上面的逻辑落地:

def merge_nested_dicts(a, b):
    merged = {}
    # 获取所有外层键,确保不遗漏只在a或只在b中的键
    all_outer_keys = set(a.keys()).union(set(b.keys()))
    
    for outer_key in all_outer_keys:
        # 取出当前键对应的内容,不存在则用空字典兜底
        data_a = a.get(outer_key, {})
        data_b = b.get(outer_key, {})
        
        # 处理数值字段:amount_spent和size直接相加
        total_spent = data_a.get('amount_spent', 0) + data_b.get('amount_spent', 0)
        total_size = data_a.get('size', 0) + data_b.get('size', 0)
        
        # 计算合并后的Avg,避免除以0的情况
        if total_size > 0:
            avg = total_spent / total_size
        else:
            avg = 0  # 或者根据需求设为None
        
        # 合并users:把两个users的ID都取出来,重新生成连续序号的字典
        users_list = list(data_a.get('users', {}).values()) + list(data_b.get('users', {}).values())
        merged_users = {str(idx): user_id for idx, user_id in enumerate(users_list)}
        
        # 把当前键的合并结果存入最终字典
        merged[outer_key] = {
            'Avg': avg,
            'amount_spent': total_spent,
            'size': total_size,
            'users': merged_users
        }
    
    return merged

测试一下

把你提供的字典代入函数,看看效果:

# 你的原始字典a
a = {
    u'1009': {u'Avg': 188, u'amount_spent': 2820, u'size': 15, u'users': {u'0': 346041, u'1': 658546, u'2': 658194, u'3': 658316}},
    u'1056': {u'Avg': 140, u'amount_spent': 140, u'size': 1, u'users': {u'0': 645767}},
    u'1103': {u'Avg': 95, u'amount_spent': 285, u'size': 3, u'users': {u'0': 339285, u'1': 658440}}
}

# 你的原始字典b(补全了省略的部分)
b = {
    u'1009': {u'Avg': 246.25, u'amount_spent': 1970, u'size': 8, u'users': {u'0': 61496, u'1': 1350, u'2': 164852, u'3': 517760, u'4': 576458, u'5': 203840, u'6': 52239, u'7': 516672}}
}

# 执行合并
merged_result = merge_nested_dicts(a, b)
print(merged_result)

运行后,1009对应的合并结果会是:

  • amount_spent = 2820 + 1970 = 4790
  • size = 15 + 8 = 23
  • Avg = 4790 / 23 ≈ 208.26
  • users会包含a里的4个用户ID和b里的8个用户ID,序号从0到11

可选调整:加权平均计算Avg

如果你不想用总花费除以总人数,而是想基于原来的平均值做加权平均(比如保留各自的权重),可以把Avg的计算改成这样:

a_avg = data_a.get('Avg', 0)
a_size = data_a.get('size', 0)
b_avg = data_b.get('Avg', 0)
b_size = data_b.get('size', 0)

if total_size > 0:
    avg = (a_avg * a_size + b_avg * b_size) / total_size
else:
    avg = 0

这样计算出来的Avg会更贴合原始数据的平均逻辑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:33