如何在Python3.7中比较两个Ordered Dict并生成差异有序字典?
解决OrderedDict对比生成有序差异字典的问题
需求明确:生成一个有序的差异字典dif_d,包含mod_d中与ref_d相比值不同的已有键值对,以及新增的键值对,且保持mod_d的原有顺序。
问题分析
- 用集合求差
set1 - set0能得到差异内容,但集合是无序结构,会丢失原字典的顺序。 - 你写的遍历伪代码存在语法错误,正确逻辑需要拆分两种判断条件:键不存在于参考字典,或键存在但值不匹配。
正确实现代码
from collections import OrderedDict # 初始化参考有序字典 ref_d = OrderedDict([ ('shape', 'square'), ('color', 'white'), ('posxy', '0,0'), ('scale', 'small'), ('rotxy', '0,0'), ('modif', 'no'), ('autom', 'no'), ('lumin', 'min'), ('backg', 'none'), ('outpu', 'no') ]) # 初始化修改后的有序字典 mod_d = OrderedDict([ ('shape', 'square'), ('color', 'red'), ('posxy', '0,0'), ('scale', 'small'), ('rotxy', '0.5,0.5'), ('modif', 'no'), ('autom', 'no'), ('varia', 'true'), ('lumin', 'max'), ('backg', 'none'), ('outpu', 'yes'), ('specm', 'true') ]) dif_d = OrderedDict() # 按顺序遍历修改后的字典,筛选差异项 for key, value in mod_d.items(): # 两种情况加入差异字典:新增键,或已有键值不匹配 if key not in ref_d or ref_d[key] != value: dif_d[key] = value # 输出结果与预期一致 print(dif_d)
代码说明
- 遍历
mod_d的键值对,天然保持原字典的顺序。 - 判断逻辑拆分:
key not in ref_d:识别新增的键值对,直接加入dif_dref_d[key] != value:识别已有键但值不同的项,加入dif_d
- 最终
dif_d完全符合需求,顺序与mod_d一致,包含所有差异和新增内容。
版本兼容说明
如果使用Python 3.7及以上版本,普通字典默认支持插入顺序保留,因此可以直接用普通字典替代OrderedDict,代码逻辑完全不变。
内容的提问来源于stack exchange,提问作者Cristobal Vila
相关产品推荐
相关产品推荐

