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

如何结合custom_operators与iterable_compare_func正确使用DeepDiff?

解决DeepDiff比较字典列表时的元素配对与指标差异问题

要实现按variable字段配对字典、仅标记新指标小于旧指标的差异,需结合自定义迭代匹配函数和自定义比较算子,同时规避默认的位置匹配逻辑,具体步骤如下:

1. 实现自定义比较算子

定义CloseToOrGreaterThan算子,仅当新指标≥旧指标时判定为无差异:

from deepdiff import DeepDiff, BaseOperator

class CloseToOrGreaterThan(BaseOperator):
    def compare(self, new_val, old_val):
        # new_val是新列表中的指标值,old_val是旧列表中的指标值
        return new_val >= old_val

2. 定义元素配对函数

指定仅当两个字典的variable字段相同时,才作为配对元素进行比较:

def match_variable_entries(old_dict, new_dict):
    return old_dict.get('variable') == new_dict.get('variable')

3. 正确调用DeepDiff

同时传入自定义配对函数和算子,并绑定算子到目标指标字段(假设指标字段为value):

# 测试数据
old_list = [
    {"variable": "cpu_usage", "value": 70},
    {"variable": "memory_usage", "value": 50}
]

new_list = [
    {"variable": "memory_usage", "value": 45},  # 指标变小,应标记差异
    {"variable": "cpu_usage", "value": 75}     # 指标变大,无差异
]

# 配置并执行比较
diff_result = DeepDiff(
    old_list,
    new_list,
    iterable_compare_func=match_variable_entries,
    custom_operators=[CloseToOrGreaterThan(paths="root[*].value")],
    ignore_order=False  # 禁用默认的顺序忽略,依赖自定义配对逻辑
)

print(diff_result)

关键注意事项

  • 避免冲突配置:不要同时设置ignore_order=True,否则会覆盖自定义配对逻辑,导致元素匹配混乱。
  • 精准绑定算子路径:通过paths="root[*].value"确保算子仅作用于字典中的指标字段,不影响其他字段的比较。
  • 处理新增/删除元素:如果列表存在新增或删除的variable条目,DeepDiff会默认标记为added或removed,若需忽略这类差异,可添加ignore_added=True或ignore_removed=True参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:25:19