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

如何在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)

代码说明

  1. 遍历mod_d的键值对,天然保持原字典的顺序。
  2. 判断逻辑拆分:
    • key not in ref_d:识别新增的键值对,直接加入dif_d
    • ref_d[key] != value:识别已有键但值不同的项,加入dif_d
  3. 最终dif_d完全符合需求,顺序与mod_d一致,包含所有差异和新增内容。

版本兼容说明

如果使用Python 3.7及以上版本,普通字典默认支持插入顺序保留,因此可以直接用普通字典替代OrderedDict,代码逻辑完全不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:50:26