如何保持键/值与声明的顺序相同?

新手上路,请多包涵

我有一本以特定顺序声明的字典,并希望始终保持该顺序。键/值不能真正根据它们的值按顺序保存,我只希望它按照我声明的顺序排列。

所以如果我有字典:

 d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

如果我查看它或遍历它,它就不是这个顺序。有什么方法可以确保 Python 保持我在其中声明键/值的显式顺序?

原文由 roflwaffle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 220
1 个回答

从 Python 3.6 开始,标准 dict 类型默认保持插入顺序。

定义

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}

将生成一个字典,其中的键按照源代码中列出的顺序排列。

这是通过为稀疏哈希表使用一个带有整数的简单数组来实现的,其中这些整数索引到另一个存储键值对(加上计算的哈希)的数组中。后一个数组恰好按插入顺序存储项目,整个组合实际上使用的内存少于 Python 3.5 及之前的实现。有关详细信息,请参阅 Raymond Hettinger 的原始想法帖子

在 3.6 中,这仍然被认为是一个实现细节;请参阅 Python 3.6 文档中的新增功能

这个新实现的顺序保留方面被认为是一个实现细节,不应依赖(这可能会在未来改变,但在更改语言规范之前,希望在语言中使用这个新的 dict 实现几个版本为所有当前和未来的 Python 实现强制保留顺序语义;这也有助于保持与旧版本语言的向后兼容性,其中随机迭代顺序仍然有效,例如 Python 3.5)。

Python 3.7 将此实现细节提升为 _语言规范_,因此现在强制要求 dict 在与该版本或更新版本兼容的所有 Python 实现中保留顺序。参见 BDFL 的声明。从 Python 3.8 开始,字典还支持 反向迭代

在某些情况下,您可能仍想使用 collections.OrderedDict(),因为它在标准 dict 类型之上提供了一些附加功能。例如 可逆(这扩展到 视图对象)和支持重新排序(通过 move_to_end() 方法)。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题