加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

将dict传递给OrderedDict有什么问题?

发布时间:2020-12-20 12:00:55 所属栏目:Python 来源:网络整理
导读:我正在阅读@Martijn Pieters对 Converting dict to OrderedDict的回复.他回答的主要观点是将常规字典传递给OrderedDict()将不会保留所需的顺序,因为你传递的字典已经“丢失”了任何外表秩序他的解决方案是传递组成dict的键/值对的元组. 但是,我在docs中也注
我正在阅读@Martijn Pieters对 Converting dict to OrderedDict的回复.他回答的主要观点是将常规字典传递给OrderedDict()将不会保留所需的顺序,因为你传递的字典已经“丢失”了任何外表秩序他的解决方案是传递组成dict的键/值对的元组.

但是,我在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循环,那么我得到同样的(正确的)顺序,似乎暗示可以传递dict本身.

编辑:这也引起了我的困惑:Are dictionaries ordered in Python 3.6+?

解决方法

Order is retained for keyword arguments passed to the OrderedDict

这意味着以下内容可以保证保留顺序:

od = OrderedDict(a=20,b=30,c=40,d=50)

也就是说,传递关键字参数的顺序保留在** kwargs中.这在Python 3.6中是一种语言特性;所有其他实现都需要效仿.

这是如何工作的,为了执行此调用,创建了一个包含关键字参数的字典.作为一个词典,在3.6之前,它丢失了关于这些词的提供顺序的信息.

随着PEP 468在3.6中被接受,现在保证使用有序映射来保存此信息(在CPython中,“有序映射”恰好是一个字典,但是,这是一个实现细节 – 更新:语言功能从Python 3.7开始.)

正如您目前所做的那样,使用OrderedDict(ship)也会保留3.6中的顺序,因为dict现在具有该实现,而不是由于PEP 468.这是您不应该依赖的,因为它被认为是CPython实现的实现细节;在未来,这可能会改变(看起来会如此),但在此之前,你不应该依赖它.

从Python 3.7开始,之前的版本现在可以保证在实现中保持顺序,因为dict插入顺序现在是一种语言功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读