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

Python中比较两个二维字典的代码实现及技术咨询

二维字典比较的代码分析与优化建议

嘿,我来帮你拆解下这段代码的问题,以及怎么优化来适配二维字典的对比需求~

首先说结论:你现在的代码没法准确实现二维字典的深层比较——它只能对比顶层字典的键,对于嵌套的内层字典(也就是二维结构里的第二层dict),只会把整个内层dict当作一个单一值来判断相等与否。举个例子:

d1 = {'a': {'x': 1}, 'b': 2}
d2 = {'a': {'x': 3}, 'b': 2}

用你的dict_compare函数跑的话,会把'a'放到modified里,值是({'x':1}, {'x':3}),但不会告诉你是内层的'x'键对应的值变了,没法定位到二维结构里的具体差异。

优化方案:递归实现嵌套字典比较

要适配二维(甚至多维)字典的对比,我们可以把比较逻辑改成递归的,遇到值是字典的情况就继续深入比较,而不是直接判断相等。下面是优化后的代码:

import collections
import pprint

def dict_compare(d1, d2, parent_key=""):
    d1_keys = set(d1.keys())
    d2_keys = set(d2.keys())
    added = {f"{parent_key}.{k}" if parent_key else k for k in d1_keys - d2_keys}
    removed = {f"{parent_key}.{k}" if parent_key else k for k in d2_keys - d1_keys}
    modified = {}
    same = set()

    for key in d1_keys.intersection(d2_keys):
        full_key = f"{parent_key}.{key}" if parent_key else key
        val1, val2 = d1[key], d2[key]
        # 如果都是字典,递归比较
        if isinstance(val1, dict) and isinstance(val2, dict):
            nested_added, nested_removed, nested_modified, nested_same = dict_compare(val1, val2, full_key)
            added.update(nested_added)
            removed.update(nested_removed)
            modified.update(nested_modified)
            same.update(nested_same)
        else:
            if val1 != val2:
                modified[full_key] = (val1, val2)
            else:
                same.add(full_key)
    return added, removed, modified, same

# 测试用例
checkslist1 = collections.defaultdict(dict)
checkslist1['user1']['age'] = 25
checkslist1['user1']['city'] = 'NY'
checkslist1['user2']['age'] = 30

checkslist2 = collections.defaultdict(dict)
checkslist2['user1']['age'] = 26
checkslist2['user2']['age'] = 30
checkslist2['user3']['city'] = 'LA'

added, removed, modified, same = dict_compare(checkslist1, checkslist2)
print("Added keys:", added)
print("Removed keys:", removed)
print("Modified keys:", modified)
print("Same keys:", same)

优化点说明

  • 递归处理嵌套:当遇到值为字典的元素时,递归调用dict_compare,并带上当前的父键路径,这样可以精准定位到嵌套层级的差异
  • 键路径标注:用parent_key拼接出完整的键路径(比如user1.age),让你一眼就能看到是二维字典里的哪个具体键发生了变化
  • 兼容defaultdict:因为defaultdict本质也是dict的子类,所以这个函数可以直接处理你用到的collections.defaultdict(dict)结构

额外小提示

如果你的二维字典里还可能包含列表等其他可迭代结构,还可以再扩展逻辑,对列表也做逐项比较——不过如果只是纯二维字典的话,上面的代码完全够用啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:44:30