Bra*_*mon 3 python dictionary ordereddictionary python-3.x python-3.6
我正在阅读@Martijn Pieters对将dict转换为OrderedDict的回应.他的回答的主要观点是,通过一个普通的字典OrderedDict()将不会保留所需的顺序,因为你传递的字典已经"丢失"了任何相似的顺序.他的解决方案是传递组成dict的键/值对的元组.
但是,我在文档中也注意到以下内容:
在版本3.6中更改:接受PEP 468后,将保留传递给OrderedDict的关键字参数的顺序
这是否会使Martijn指出的问题无效(你现在可以将一个字典传递给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)])
Run Code Online (Sandbox Code Playgroud)
如果我for key in ...在OrderedDict上运行一个循环,我得到同样的(正确的)顺序,似乎暗示可以传递dict本身.
编辑:这也引起了我的困惑:是否在Python 3.6+中订购了字典?
传递给OrderedDict的关键字参数保留顺序
这意味着以下内容可以保证保留顺序:
od = OrderedDict(a=20, b=30, c=40, d=50)
Run Code Online (Sandbox Code Playgroud)
也就是说,传递关键字参数的顺序保留在**kwargs.这在Python 3.6中是一种语言特性 ; 所有其他实现都需要效仿.
这是如何工作的,为了执行此调用,创建了一个包含关键字参数的字典.作为一个dict之前3.6,它失去了关于其中这些被提供的顺序的信息.
随着PEP 468在3.6中被接受,这保证现在使用有序映射来保存此信息(在CPython中,"有序映射"碰巧是一个dict但是,这是一个实现细节 - 更新:语言功能如Python 3.7.).
使用OrderedDict(ship),因为你目前做的,还保留了顺序3.6,因为dict有现在的实施,不因PEP 468这是你不应该依赖于它被认为是CPython的执行情况的实现细节; 在未来,这可能会改变(看起来会如此),但在此之前,你不应该依赖它.
从Python 3.7开始,之前的版本现在可以保证在实现中保留顺序,因为dict插入顺序现在是一种语言功能.