我正在阅读@Martijn Pieters对Converting dict to OrderedDict的回复。他的回答的主要观点是将常规字典传递给OrderedDict()
将不会保留所需的顺序,因为你传递的字典已经“丢失”了任何相似的顺序。他的解决方案是传递组成dict的键/值对的元组。
但是,我还注意到docs中的以下内容:
版本3.6中已更改:接受PEP 468后,订单为 保留用于传递给OrderedDict的关键字参数
这是否会使Martijn指出的问题无效(您现在可以将dict传递给OrderedDict),还是我误解了?
from collections import OrderedDict
ship = {'NAME': 'Albatross',
'HP':50,
'BLASTERS':13,
'THRUSTERS':18,
'PRICE':250}
print(ship) # order lost as expected
{'BLASTERS': 13, 'HP': 50, 'NAME': 'Albatross', 'PRICE': 250, 'THRUSTERS': 18}
print(OrderedDict(ship)) # order preserved even though a dict is passed?
OrderedDict([('NAME', 'Albatross'),
('HP', 50),
('BLASTERS', 13),
('THRUSTERS', 18),
('PRICE', 250)])
如果我在OrderedDict上运行for key in ...
循环,我得到同样(正确)的顺序,似乎暗示可以传递dict本身。
修改:这也引起了我的困惑:Are dictionaries ordered in Python 3.6+?
答案 0 :(得分:7)
传递给OrderedDict的关键字参数保留订单
这意味着以下保证保留订单:
od = OrderedDict(a=20, b=30, c=40, d=50)
也就是说,传递关键字参数的顺序保留在**kwargs
中。在Python 3.6中,这是一个语言特性;所有其他实施都需要效仿。
这是如何工作的,为了执行此调用,将创建一个包含关键字参数的字典。作为dict
,在3.6
之前,它丢失了有关这些提供顺序的信息。
随着PEP 468在3.6中被接受,现在保证使用有序映射来保存此信息(在CPython中,“有序映射”恰好是{{1}但是,这是一个实现细节 - 更新:从Python 3.7开始的语言功能。)。
正如您目前所做的那样,使用dict
也会保留OrderedDict(ship)
中的顺序,因为3.6
现在具有该实现,而不是由于PEP 468.这是您不应该依赖的因为它被认为是CPython实现的实现细节;在未来,这可能会改变(看起来会如此),但在此之前,你不应该依赖它。
从Python 3.7 开始,现在可以保证以前的实现顺序,因为dict
插入顺序现在是一种语言功能。