Python3中的collections模块实现了特定目标的容器,以提供Python标准内建容器dict、list、set和tuple的替代选择,包括namedtuple、deque、ChainMap、Counter、OrderedDict、defaultdict、UserDict、UserList、UserString。这里介绍下OrderedDict,它继承自dict,返回dict子类的实例,实现在 https://github.com/python/cpython/blob/3.10/Lib/collections/__init__.py。

OrderedDict是dict子类,OrderedDict会记住item插入的顺序。常规dict不跟踪插入顺序,迭代它会以任意顺序给出值(Python 3.7之前的版本会这样)。Python 3.7开始,dict的插入顺序也得到保证

如果某个key的值发生变化,key在OrderedDict中的位置保持不变。

删除和重新插入相同的key会将它push到后面作为OrderedDict,但是,保持插入的顺序。

OrderedDict比dict中多的函数为move_to_end。此函数将现有key移动到OrderedDict的任一端。如果参数last为True(默认值),则将item移至末尾;如果last为False,则移至开头。如果key不存在,则触发KeyError。

OrderedDict与dict差异:

(1).dict被设计为非常擅长映射操作(map operation),跟踪插入顺序是次要的。

(2).OrderedDict旨在擅长重新排序操作(reorder operation),空间效率、迭代速度和更新操作的性能是次要的。

(3).在算法上,OrderedDict可以比dict更好地处理频繁的重新排序操作。

(4).OrderedDict的popitem函数具有不同的签名,它接受一个可选参数来指定pop的pair(key, value)是LIFO order(当last为True时)还是FIFO order。

(5).OrderedDict的move_to_end函数可以有效地将item移动到任一端。

(6).OrderedDict对象与常规dict比较,对顺序不敏感;但是OrderedDict对象之间的相等性判断是顺序敏感的。

测试代码如下:

from collections import OrderedDictvar = 2
if var == 1:# reference: https://www.geeksforgeeks.org/ordereddict-in-python/# 注:在Python 3.7.11中,多次执行以下测试代码,dict和OrderedDict的输出结果始终相同# 从python 3.7开始,python dict的插入顺序是有保证的print("This is a dict:")d = {}d["a"] = 1; d["b"] = 2; d["c"] = 3; d["d"] = 4for key, value in d.items():print(key, value, end=",")d["c"] = 5; print("")for key, value in d.items():print(key, value, end=",")d.pop("c"); print("")for key, value in d.items():print(key, value, end=",")d["c"] = 3; print("")for key, value in d.items():print(key, value, end=",")print("\nThis is an Ordered Dict:")od = OrderedDict()od["a"] = 1; od["b"] = 2; od["c"] = 3; od["d"] = 4for key, value in od.items():print(key, value, end=",")# 如果某个key的值发生变化,key在OrderedDict中的位置保持不变od["c"] = 5; print("")for key, value in od.items():print(key, value, end=",")# 删除和重新插入相同的key会将它push到后面作为OrderedDcit,但是,保持插入的顺序od.pop("c"); print("")for key, value in od.items():print(key, value, end=",")od["c"] = 3; print("")for key, value in od.items():print(key, value, end=",")print("")
elif var == 2:od = OrderedDict()print(isinstance(od, OrderedDict)) # Trueprint(isinstance(od, dict)) # Trueod["a"] = 1; od["b"] = 2; od["c"] = 3; od["d"] = 4# popitem: 返回一个(key, value)键值对.如果last为True,则按LIFO后进先出的顺序返回键值对,否则就按FIFO先进先出的顺序返回键值对print(od.popitem(last=True)) # ('d', 4)print(od.popitem(last=False)) # ('a', 1)od["e"] = 5; od["f"] = 6for key, value in od.items():print(key, value, end=",") # b 2,c 3,e 5,f 6,print("")# move_to_end: 将现有key移动到OrderedDict的任一端.如果last为True(默认值),则将item移至末尾;如果last为False,则移至开头;如果key不存在,则触发KeyErrorod.move_to_end("c", last=True)for key, value in od.items():print(key, value, end=",") # b 2,e 5,f 6,c 3,print("")od.move_to_end("c", last=False)for key, value in od.items():print(key, value, end=",") # c 3,b 2,e 5,f 6,print("")# OrderedDict对象与常规dict比较,对顺序不敏感d1 = {"c":3, "b":2, "e":5, "f":6}; print(od == d1) # Trued2 = {"b":2, "e":5, "f":6, "c":3}; print(od == d2) # Trueprint(d1 == d2) # True# ​OrderedDict对象之间的相等性判断是顺序敏感的od2 = OrderedDict()od2["c"] = 3; od2["b"] = 2; od2["e"] = 5; od2["f"] = 6; print(od == od2) # Trueod3 = OrderedDict()od3["c"] = 3; od3["b"] = 2; od3["f"] = 6; od3["e"] = 5; print(od3 == od2) # Falseprint("test finish")

GitHub:https://github.com/fengbingchun/Python_Test

Python3中collections.OrderedDict介绍相关推荐

  1. Python3中typing模块介绍

    typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py.此模块为类型提示(Type Hints)提供运行时支持( ...

  2. Python3中lambda表达式介绍

    Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称.def关键字用于在Python3中创建一个普通函数,类似地,lambda ...

  3. Python3中pass语句介绍

    python3中的pass语句是一个空语句,什么都不做,执行它时什么也没有发生,是一个空操作. pass语句通常用作占位符(place-holder),即当用户不知道要编写什么代码时,用户只需在那行上 ...

  4. Python3中__call__方法介绍

    如果Python3类中有__call__方法,那么此类实例的行为类似于函数并且可以像函数一样被调用.当实例作为函数被调用时,如果定义了此方法,则x(arg1, arg2, -)是x.__call__( ...

  5. Python3中pickle模块介绍

          Pyhton3中的pickle模块用于对Python对象结构的二进制进行序列化(或pickling)和反序列化(或unpickling)."pickling"是将Pyt ...

  6. Python3中Pillow(PIL)介绍

          PIL全称为Python Imaging Library,是Python中的免费开源图像处理库.PIL的最新版本为1.1.7,于2009年9月发布,支持Python的最高版本到2.7.原始 ...

  7. Python3中装饰器介绍

          Python中的装饰器(decorator)是一个接受另一个函数作为参数的函数.装饰器通常会修改或增强它接受的函数并返回修改后的函数.这意味着当你调用一个装饰函数时,你会得到一个与基本定义 ...

  8. Python3中省略号(...)用法介绍

    1. 省略号(...)是一个Python对象,叫Ellipsis,它没有方法,是一个单例对象(singleton object): # 1. ...是一个python对象,叫Ellipsis prin ...

  9. Python3中.pyd文件介绍

    .pyd文件是用Python编写生成的动态链接库,包含一个或多个Python modules,可以被其它Python代码调用. 以下是.pyd的生成及调用测试:       通过conda创建虚拟环境 ...

最新文章

  1. VC6.0使用中遇到的一些问题
  2. c++ lambda基本语法
  3. 产品问答 | 领导把锅甩给你,你会怎么做?
  4. window 程序报错 自动重启_好程序员web前端教程之详解JavaScript严格模式
  5. classcastexception异常_内部类、异常以及 LeetCode 每日一题
  6. 想做硬件开发的人员必看
  7. set集合 结构体_Redis底层数据结构
  8. 查看目录是否为内存盘_CentOS系列002:挂载数据盘
  9. matlab单层感知器画线,MATLAB神经网络学习(1):单层感知器
  10. LINUX下载编译nginx
  11. 【图解】ERP系统如何操作?具体步骤是什么?
  12. 假如时光能够倒流, 我会这么学习Java
  13. ddm模型公式_cfa讲义-估值中的折现方法-DDM模型(2)
  14. js去掉url中的域名的方法
  15. android dfu升级
  16. ViewPager翻页动画失效详解
  17. SQL 关于时区的处理案例
  18. Kubernetes-10 K8s集群安全机制
  19. ChatGPT国内在线版、微信版
  20. 仿小米视频下滑视频动画效果

热门文章

  1. 回顾2021,展望2022
  2. GitHub上的“金矿”(236个Python开源项目,涵盖了15个领域)
  3. 基于pytorch的模型剪枝+模型量化+BN合并+TRT部署(cifar数据)(2)
  4. JS中编写函数去除HTML标签,js函数获取html中className所在的内容并去除标签
  5. ncurse界面编程多线程示例
  6. l-lsblk查看设备可用块设备
  7. shell脚本编程学习笔记(四)shell操作数据库
  8. jmeter实现多并发
  9. Handlebars模板引擎
  10. node 实现blog博客