Python 如何让 dict 按照插入顺序遍历(OrderedDict vs 3.7+)

11次阅读

python 3.7+ 的 dict 默认保持插入顺序,是语言规范;OrderedDict 仍适用于顺序敏感比较、移动键位置和弹出特定位置项等场景。

Python 如何让 dict 按照插入顺序遍历(OrderedDict vs 3.7+)

Python 3.7+ 的内置 dict 默认保持插入顺序,无需额外处理即可按插入顺序遍历;而 Python 3.6(仅限 CPython 实现)和更早版本中,需使用 collections.OrderedDict 才能保证顺序。

Python 3.7+:普通 dict 就够用

从 Python 3.7 开始,dict 的插入顺序保留是语言规范的一部分(不再是 CPython 的实现细节),所有符合标准的 Python 解释器都必须支持。这意味着:

  • for k in d:d.keys()d.values()d.items() 都按插入顺序返回
  • 删除再重新插入同一 key 会将其放到末尾(行为与 OrderedDict.move_to_end() 类似)
  • 不需要导入任何模块,开箱即用

OrderedDict 的独特用途(即使在 3.7+ 中)

OrderedDict 并未过时,它在以下场景仍有不可替代性:

  • 顺序敏感的相等判断:两个 OrderedDict 只有键值对完全相同 且顺序一致 才判为相等;普通 dict 只看内容,不看顺序
  • 移动键位置:支持 .move_to_end(key, last=True),可把某个 key 移到开头或结尾
  • 弹出特定位置的项:支持 .popitem(last=True) 弹出末尾/开头项;普通 dict.popitem() 在 3.7+ 也支持 last 参数,但 OrderedDict 更早提供该能力

兼容旧版本(如 3.6 或 2.7)怎么办?

若需支持 Python OrderedDict:

立即学习Python免费学习笔记(深入)”;

from collections import OrderedDict 

d = OrderedDict() d['first'] = 1 d['second'] = 2 d['third'] = 3

遍历时一定按 first → second → third

注意:不要用 OrderedDict(dict(...)) 构造,因为传入的普通 dict 在旧版本中本身无序,会丢失原始顺序。应逐个插入,或用 OrderedDict([('a',1), ('b',2)]) 这种序列方式初始化。

一个小陷阱:字面量 vs 动态插入

在 Python 3.7+ 中,字典字面量 {'a':1, 'b':2} 的顺序就是书写顺序,但要注意:

  • 如果键名是变量或表达式,实际插入顺序仍由运行时求值顺序决定,不是源码书写顺序
  • 重复 key 会被覆盖,最后赋值的生效,位置以最后一次插入为准

text=ZqhQzanResources