如何结合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
相关产品推荐
相关产品推荐

