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

Python中合并两个defaultdict的方法——基于文献记录场景

嘿,我来帮你搞定这两个嵌套defaultdict的合并问题!结合你处理2000万条文献记录的场景,咱们分两种常见需求来实现:

1. 基础合并(直接追加列表元素)

你的d1和d2都是defaultdict(lambda: defaultdict(list))的嵌套结构——外层键对应作者/术语,内层键关联对应的文献ID列表。基础合并的逻辑是:把d2里的所有内容合并到d1中,相同层级下的列表直接追加元素,不存在的键会自动创建(得益于defaultdict的特性)。

实现代码

from collections import defaultdict

# 假设已填充好的d1和d2(示例数据)
d1 = defaultdict(lambda: defaultdict(list))
d2 = defaultdict(lambda: defaultdict(list))

d1["author1"]["literature_ids"].extend(["001", "002"])
d1["term1"]["literature_ids"].extend(["001", "003"])
d2["author1"]["literature_ids"].extend(["002", "004"])
d2["term2"]["literature_ids"].extend(["005"])

# 合并函数:将source合并到target中
def merge_nested_defaultdicts(target, source):
    for outer_key, inner_dict in source.items():
        # 自动获取或创建target的内层字典
        target_inner = target[outer_key]
        for inner_key, item_list in inner_dict.items():
            # 追加所有元素到对应的列表
            target_inner[inner_key].extend(item_list)

# 执行合并:把d2合并进d1
merge_nested_defaultdicts(d1, d2)

# 查看合并结果
for outer_key, inner_dict in d1.items():
    print(f"{outer_key}: {inner_dict}")

执行后,d1会包含所有d1和d2的内容,比如author1对应的literature_ids会变成["001", "002", "002", "004"]。

2. 带去重的合并(避免重复文献ID)

如果你的列表里是唯一的文献ID,不想出现重复记录,可以在合并时加入去重逻辑。这里推荐用dict.fromkeys()实现去重,既能保证元素唯一,又能保留原始的插入顺序(Python 3.7+支持)。

实现代码

def merge_nested_defaultdicts_with_dedupe(target, source):
    for outer_key, inner_dict in source.items():
        target_inner = target[outer_key]
        for inner_key, item_list in inner_dict.items():
            # 合并已有元素和新元素,再去重
            combined = target_inner[inner_key] + item_list
            target_inner[inner_key] = list(dict.fromkeys(combined))

# 执行带去重的合并
merge_nested_defaultdicts_with_dedupe(d1, d2)

执行后,author1对应的literature_ids会变成["001", "002", "004"],重复的002被自动去掉了。

3. 不修改原字典,创建新的合并结果

如果不想改动原来的d1和d2,可以新建一个空的嵌套defaultdict,先合并d1再合并d2:

merged_dict = defaultdict(lambda: defaultdict(list))
merge_nested_defaultdicts(merged_dict, d1)
merge_nested_defaultdicts(merged_dict, d2)

这样merged_dict就是独立的合并结果,不会影响原有的d1和d2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:58:09