将字典传递给 OrderedDict 有什么问题?
What's wrong with passing a dict to OrderedDict?
我正在阅读@Martijn Pieters 对 Converting dict to OrderedDict 的回复。他回答的要点是,将常规字典传递给 OrderedDict()
不会保留所需的顺序,因为您传递的字典已经 "lost" 任何顺序。他的解决方案是传递构成字典的 key/value 对的元组。
然而,我也注意到 docs 中的以下内容:
Changed in version 3.6: With the acceptance of PEP 468, order is
retained for keyword arguments passed to the 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)])
如果我 运行 也对 OrderedDict 进行 for key in ...
循环,我会得到相同的(正确的)顺序,这似乎暗示可以传递 dict 本身。
编辑:这也让我有些困惑:
Order is retained for keyword arguments passed to the OrderedDict
这意味着以下内容保证保留顺序:
od = OrderedDict(a=20, b=30, c=40, d=50)
即在**kwargs
中保留了关键字参数传递的顺序。在 Python 3.6 中,这是一个 语言特性 ;所有其他实现都需要效仿。
这是如何工作的,为了执行此调用,创建了一个包含关键字参数的字典。作为 dict
,在 3.6
之前,它丢失了有关这些提供顺序的信息。
随着 PEP 468 在 3.6 中被接受,现在可以保证使用 有序映射 来保存此信息(在 CPython 中,"ordered mapping" 恰好是 dict
但是,这是一个实现细节 -- 更新: Python 3.7.) 的语言功能。
使用 OrderedDict(ship)
,就像你目前所做的那样,也保留了 3.6
中的顺序,因为 dict
现在有那个实现,而不是由于 PEP 468。这是你不应该的t 取决于,因为它被认为是 CPython 实现的实现细节;将来这可能会改变(看起来会改变),但在那之前,您不应该依赖它。
从 Python 3.7 开始,现在可以保证在实现中保留顺序,因为 dict
插入顺序现在是一种语言功能。
我正在阅读@Martijn Pieters 对 Converting dict to OrderedDict 的回复。他回答的要点是,将常规字典传递给 OrderedDict()
不会保留所需的顺序,因为您传递的字典已经 "lost" 任何顺序。他的解决方案是传递构成字典的 key/value 对的元组。
然而,我也注意到 docs 中的以下内容:
Changed in version 3.6: With the acceptance of PEP 468, order is retained for keyword arguments passed to the 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)])
如果我 运行 也对 OrderedDict 进行 for key in ...
循环,我会得到相同的(正确的)顺序,这似乎暗示可以传递 dict 本身。
编辑:这也让我有些困惑:
Order is retained for keyword arguments passed to the OrderedDict
这意味着以下内容保证保留顺序:
od = OrderedDict(a=20, b=30, c=40, d=50)
即在**kwargs
中保留了关键字参数传递的顺序。在 Python 3.6 中,这是一个 语言特性 ;所有其他实现都需要效仿。
这是如何工作的,为了执行此调用,创建了一个包含关键字参数的字典。作为 dict
,在 3.6
之前,它丢失了有关这些提供顺序的信息。
随着 PEP 468 在 3.6 中被接受,现在可以保证使用 有序映射 来保存此信息(在 CPython 中,"ordered mapping" 恰好是 dict
但是,这是一个实现细节 -- 更新: Python 3.7.) 的语言功能。
使用 OrderedDict(ship)
,就像你目前所做的那样,也保留了 3.6
中的顺序,因为 dict
现在有那个实现,而不是由于 PEP 468。这是你不应该的t 取决于,因为它被认为是 CPython 实现的实现细节;将来这可能会改变(看起来会改变),但在那之前,您不应该依赖它。
从 Python 3.7 开始,现在可以保证在实现中保留顺序,因为 dict
插入顺序现在是一种语言功能。