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
相关产品推荐
相关产品推荐

