Python3中collections.OrderedDict介绍
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
相关文章:

汗!雅虎中国个人空间
今天发现雅虎中国有了个人空间,偷偷试了下,让人失望到极点,几乎没有什么特点,和MSN很相似,空间相册放着好好的Flickr不用,偏偏弄了个很垃圾的相册,还有整合能力也不行。都不知道del.icio.us和Fl…

关于v$process与v$session中process的理解
v$session有个process字段,V$PROCESS有个SPID字段,这两个字段是不是一个意思呢?是不是都代表会话的操作系统进程呢?官方文档上的解释:SPID VARCHAR2(12) Operating system process identifierPROCESS VARCHAR2…

Python3中lambda表达式介绍
Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称。def关键字用于在Python3中创建一个普通函数,类似地,lambda关键字用于在Python3中创建匿名函数。 Python3 lambda函数语法: lambda pa…
6大理由,告诉你为什么这个大会你不能错过! | 文末有福利
作者 | Carol出品 | 区块链大本营(blockchain_camp)* 文末可参与活动赢赠票!如果说有一个什么领域,能让中科院、华为、腾讯、京东、360、微众银行的大咖汇聚在一起,那一定是——区块链。悄咪咪地给大家剧透一下&#x…

魔与道的反复较量 反垃圾邮件技术
反垃圾邮件武器库不同的反垃圾邮件产品采用的技术有所不同,但总体来说,不外乎以下几种技术,其中,针对垃圾邮件的核心技术有贝叶斯智能分析、垃圾邮件评分、垃圾邮件指纹识别。转载于:https://blog.51cto.com/aonlin/17074

在Centos 7下编译openwrt+njit-client
首先要有一个centos7 step1:更新系统的源: yum install update 但是发现官方的源好像被墙了,于是自己又去换源,找163的源换。具体的操作最后的链接。 可是换完源之后发现163的源只支持到centos6、、、、、、但是就泪崩了。于是又把源换了回来…

Python3中内置函数callable介绍
Python3中的内置函数callable接受一个对象参数,如果此对象参数看起来可调用,则callable函数返回True,否则返回False。如果返回True,则调用仍有可能失败;但如果返回False,则调用对象将永远不会成功。 类是可…

户外广告新创意
近来,各大城市纷纷加大了对户外广告的监管力度,部分城市甚至停止审批户外广告牌。这让户外广告运营者和广告发布商甚为头疼。 长期以来,户外广告牌扮演着截然相反的“双重角色”,在户外广告运营者和广告发布商眼中,“寸…
百度重新定义「智能屏」,瞄准10后
加入「公开课」交流群,获取更多学习资料、课程及热招岗位等信息记者 | 阿司匹林作为中国智能音箱主力推手中的一员,百度从 2017 年已经开始布局。根据数据机构Strategy Analytics发布智能音箱市场报告,2019年第三季度,百度旗下人工…

jQuery最简单的表单提交方式
第一步:绑定事件 常用的与ajax相关的事件参考如下: 1、$(selector).click(function) 2、$(selector).change(function) 3、$(selector).keyup(function) 4、$(selector).submit(function) 提交表单前&#…

Python3中typing模块介绍
typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py。此模块为类型提示(Type Hints)提供运行时支持(This module provides runtime support for type hints)。从python 3.5版本开始将Typing作为标准库引入。 python3中增加了Function An…

显示所有文件和文件夹无论如何 无法被设置
问题:XP系统选显示所有文件和文件夹确定后没有任何反应再次打开文件夹选项里面仍是不显示隐藏的文件和文件夹 答案:在记事本粘贴下面文字,另存为所有文件, .reg 格式。成功的话图标变为绿色碎方块。在双击它。 Windows Registry E…
工作5年后才明白的道理:不起眼的技能中,藏着你的未来
编程圈儿一直都流传着一个调侃的段子:一流程序员靠数学二流靠算法三流靠逻辑四流靠SDK五流靠Google和StackOverFlow六流靠百度和自己琢磨低端的看高端的就是黑魔法!从过来人的角度看,这不仅仅是个段子,而是目前程序员的真实写照。…

Transform-style和Perspective属性
在《CSS3 Transform——transform-origin》一文中主要介绍了CSS3 Transform属性中的transform-origin属性的使用,其实在transform属性中,transform-origin属性仅是其中之一,要彻底理解transform属性,这是不够的,必须的…

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

切尔西携手YouTube 英超第一家共享视频球队诞生
英格兰超级足球联赛冠军球队切尔西日前表示,已经与互联网视频服务网站YouTube签订了合作协议,未来将通过YouTube发布每日新闻和视频内容,从而也成为英超首支在线视频服务的球队. 据路透社报道,根据协议的内容,切尔西将建立一个YouTube旗下的品牌网站,其中将发布每日更新内容,当…
商汤联手华科:提出文字检测模型GNNets,新颖模块可解决几何分布难题
加入「公开课」交流群,获取更多学习资料、课程及热招岗位等信息编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】今年的ICCV,商汤科技及联合实验室共有57篇论文入选ICCV 2019(包含11篇Oral࿰…

(链表)反转链表Reverse List
逆转链表是简单而又简单的链表问题,其问题的方法之一可以设置三个指针,一个指向当前结点,一个指向前驱结点,一个指向后继指针 代码如下: class Solution { public:ListNode* ReverseList(ListNode* pHead) { // if(pHeadNULL || pHead->nextNULL) // return pH…

很长时间没有来了
好长时间没有来自己的博客了,更新的速度实在是太慢了,自己已经找了一份新的工作,给自己一个好的环境吧,有时间可以去学习更多的网络知识了.学习万岁!加一下,博友:思念狗的骨头:[url]http://starger.blog.51cto.com/ [/url] 他的文章还是比较不错的!转载于:https://blog.51cto.c…
十年磨一剑,可重构计算架构将引领未来芯片市场
2019 年 6 月,AI 芯片创业公司清微智能首款可重构计算架构 AI 芯片实现量产的消息在业内迅速传开,可重构计算架构芯片再次引发一波讨论的热潮。经历过十多年的技术积累,这枚小小的芯片在全球芯片市场中开启了全新的篇章。时光倒流,…

PyTorch中nn.Module类中__call__方法介绍
在PyTorch源码的torch/nn/modules/module.py文件中,有一条__call__语句和一条forward语句,如下: __call__ : Callable[…, Any] _call_impl forward: Callable[…, Any] _forward_unimplemented 在PyTorch中nn.Module类是所有神经网络模块…

压缩和归档及vi的使用
1.cat(more less head tail) /etc/passwd :查看/etc/passwd文件内容2.head -13 /etc/passwd | tail -1 :只查看/etc/passwd文件中第13行3.wc -l /etc/passwd :统计/etc/passwd文件有多少行4.grep -v "^#" /etc/inittab | grep -v &…
看到抖音上Python工程师晒得工资条,我沉默了......
我是个抖音中毒者闲来无事就喜欢刷抖音最近刷到了一个Python工程师的工资条然后我默默的打开看了然后我默默的关闭了我想这个工资算下来好像也不算高我就去其他渠道搜索了一下相关的Python工作岗位的工资好吧,都是比这个工资更高的emmm.....此时我很沉默后悔为什么我…

windows上通过cmake-gui生成pytorch工程
在Windows下通过cmake-gui.exe生成不带cuda的Torch.sln工程操作步骤:PyTorch版本使用1.8.1。首先可以先通过打开cmake-gui.exe,指定pytorch源代码目录和生成vs2017工程的位置;然后点击Configure,选中”Visual Studio 15 2017 Win6…

RequisitePro SQL SERVER数据库的配置
安装好Rational RequisitePro后,新建立一个project时,要选择库的类型,可以支持MS Access、SQL SERVER和oralce首先在SQL SERVER里新建一数据库名为”RequisitePro”然后在查询分析器里执行其自带的脚本文件,位置在《Rational安装目…

yum三种方法
RHEL5中实现各种服务的准备条件:(一)、制作YUM本地源:YUM简介:YUM是Yellow dog Updater Modified的简称,yum是软件的仓库,它可以是http或ftp站点,也可以是本地软件池,但必须包含rpm的header&…

损失函数之Cross-Entropy介绍及C++实现
在深度学习中,损失函数用来评估模型的预测值与真实值之间的差异程度,是模型对数据拟合程度的反映,拟合的越差,损失函数的值越大;反之,损失函数越小,说明模型的预测值就越接近真实值,…

C语言应用于LR中-如何得到数组长度
C语言没有提供获取数组长度的函数,最起码我不知道,所以编写了一个函数取数组的长度,调试成功,大家可以试试。另外也可以用sizeof(a)/4来取得整型数组的长度,因为整型占4个字节。效果相同。#include "web_api.h&qu…
6个你必须知道的机器学习的革命性的教训
加入「公开课」交流群,获取更多学习资料、课程及热招岗位等信息作者 | James Warner编译 | ronghuaiyang来源 | 转载自AI公园(ID:AI_Paradise)【导读】机器学习是未来,因为它将广泛应用于计算机和其他领域。尽管如此,开发有效的机…

vim ctags使用方法
一、用好系统自带软件ctags大部分的unix系统都有ctags软件,它能跟vim很好地合作。用途:生成c语言的标签文件,实现相关c文件之间的跳转。用法:1.生成标签文件在当前目录下(运行$提示符后面的命令): $ctags -R .-R表示recursive,递归,为当前目录…