OrderedDict与dict

Python入门 OrderedDict
OrderedDict是一个dict子类,它保留将键值对(通常称为项)插入字典的顺序。在OrderedDict对象上进行迭代时,将按原始顺序遍历所有项目。如果更新现有键的值,则顺序保持不变。如果删除项目然后将其重新插入,则该项目将添加到字典的末尾。

作为dict子类意味着它继承了常规词典提供的所有方法。OrderedDict还具有其他功能,您将在本教程中学习。但是,在本节中,您将学习OrderedDict在代码中创建和使用对象的基础。

创建OrderedDict对象
与相比dict,OrderedDict它不是内置类型,因此创建OrderedDict对象的第一步是从中导入类collections。有几种创建有序词典的方法。它们中的大多数与您创建常规dict对象的方式相同。例如,您可以OrderedDict通过实例化不带参数的类来创建一个空对象:
在这里插入图片描述

在这种情况下,您首先OrderedDict要从导入collections。然后,您可以通过实例化来创建一个空的有序字典,OrderedDict而无需向构造函数提供参数。

您可以通过在方括号([])中提供键并将值分配给该键,将键值对添加到字典中。当您引用时numbers,您将获得一个迭代的键值对,这些键值对按插入到字典中的顺序保存项目。

您还可以将项目的可迭代项作为参数传递给的构造函数OrderedDict:
在这里插入图片描述

当您使用诸如a或a之类的序列时,所得有序字典中各项的顺序与输入序列中各项的原始顺序匹配。如果您使用,如上面的第二个实例中所示,则在创建之前,项的最终顺序是未知的。

如果您使用常规词典作为OrderedDict对象的初始化程序,并且使用的是Python 3.6或更高版本,则将出现以下行为:
在这里插入图片描述

OrderedDict对象中项目的顺序与原始词典中的顺序匹配。另一方面,如果您使用的Python版本低于3.6,则项目顺序是未知的:
在这里插入图片描述

由于Python 3.5中的词典不记得其项目的顺序,因此在创建对象之前,您不知道结果字典中的顺序。从这一点开始,订单将保持不变。

您可以通过将关键字参数传递给类构造函数来创建有序字典:
在这里插入图片描述

从Python 3.6开始,函数保留调用中传递的关键字参数的顺序。因此,以上OrderedDict各项的顺序与将关键字参数传递给构造函数的顺序匹配。在早期的Python版本中,该顺序是未知的。

最后,OrderedDict还提供了.fromkeys(),它从可迭代的键创建一个新的字典,并将其所有值设置为一个公共值:
在这里插入图片描述

在这种情况下,您将使用键列表作为起点来创建有序词典。第二个参数.fromkeys()提供单个值给字典中的所有项目。

管理物品 OrderedDict
由于OrderedDict是可变数据结构,因此您可以对其实例执行变异操作。您可以插入新项目,更新和删除现有项目,等等。如果将新项目插入现有的有序词典中,则该项目将添加到词典末尾:
在这里插入图片描述

新添加的项目(‘four’, 4)放在基础词典的末尾,因此现有项目的顺序不受影响,并且词典保持插入顺序。

如果您从现有的有序字典中删除一个项目,然后再次插入相同的项目,则该项目的新实例将放置在字典的末尾:
在这里插入图片描述

如果删除该(‘one’, 1)项目并插入同一项目的新实例,则新项目将添加到基础词典的末尾。

如果您重新分配或更新OrderedDict对象中现有键值对的值,则键将保持其位置但会获得新值:
在这里插入图片描述

如果您在有序字典中更新给定键的值,则该键不会移动,而是会为其分配新值。同样,如果.update()用于修改现有键值对的值,则字典会记住键的位置并为其分配更新后的值。

遍历 OrderedDict
就像一般的字典,您可以迭代通过OrderedDict使用多种工具和技术的对象。您可以直接按键迭代,或者你可以使用字典的方法,如.items(),.keys()和.values():
在这里插入图片描述

第一个for循环numbers直接遍历键的键。其他三个循环使用字典方法遍历的项目,键和值numbers。

以相反的顺序迭代 reversed()
OrderedDict自Python 3.5以来提供的另一个重要功能是,它的项目,键和值支持使用进行反向迭代reversed()。此功能已添加到Python 3.8的常规词典中。因此,如果您的代码使用它,则您的向后兼容性将受到普通词典的更多限制。

您可以使用对象reversed()的项目,键和值OrderedDict:
在这里插入图片描述

本示例中的每个循环都用于reversed()以相反的顺序遍历有序字典的不同元素。

常规词典还支持反向迭代。但是,如果尝试使用低于3.8的Python版本中reversed()的常规dict对象,则会得到TypeError:
在这里插入图片描述

如果您需要以相反的顺序遍历字典中的项目,那么它OrderedDict是一个很好的盟友。使用常规字典会极大地降低您的向后兼容性,因为直到Python 3.8才将反向迭代添加到常规字典中。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yhwang-hub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值