dict
类获得了记住插入顺序的能力(在 Python 3.7
中保证了这种新行为),它们变得不那么重要了 。
与dict类的区别
- 常规的
dict
被设计为非常擅长映射操作 。跟踪插入顺序是次要的 OrderedDict
擅长重新排序操作 。空间效率、迭代速度和更新操作的性能是次要的 。- 算法上,
OrderedDict
可以比dict
更好地处理频繁的重新排序操作 。这使其适用于跟踪最近的访问(例如在 LRU cache 中) 。 - 对于
OrderedDict
,相等操作检查匹配顺序 。 OrderedDict
类的popitem()
方法有不同的签名 。它接受一个可选参数来指定弹出哪个元素 。OrderedDict
类有一个move_to_end()
方法 , 可以有效地将元素移动到任一端 。- Python 3.8之前,dict 缺少
__reversed__()
方法 。
popitem()
方法移除并返回一个 (key, value)
键值对 。如果 last
值为真,则按 LIFO
后进先出的顺序返回键值对,否则就按 FIFO
先进先出的顺序返回键值对 。from collections import OrderedDictd = OrderedDict({'status': 200, 'message': 'success'})print(f'原始的有序字典: {d}')print('被删除的键值对是: ', d.popitem(last=True))# 后进先出print(f'被删除后的有序字典: {d}')# 结果原始的有序字典: OrderedDict([('status', 200), ('message', 'success')])被删除的键值对是:('message', 'success')被删除后的有序字典: OrderedDict([('status', 200)])
from collections import OrderedDictd = OrderedDict({'status': 200, 'message': 'success'})print(f'原始的有序字典: {d}')print('被删除的键值对是: ', d.popitem(last=False))# 先进先出print(f'被删除后的有序字典: {d}')# 结果原始的有序字典: OrderedDict([('status', 200), ('message', 'success')])被删除的键值对是:('status', 200)被删除后的有序字典: OrderedDict([('message', 'success')])
move_to_end(key, last=True)将现有 key
移动到有序字典的任一端 。如果 last
为真值(默认)则将元素移至末尾;如果 last
为假值则将元素移至开头 。如果 key
不存在则会触发 KeyError
:d = OrderedDict({'status': 200, 'message': 'success'})d.move_to_end('status', last=True)print('移动后的字典: ', d)d.move_to_end('status', last=False)print('移动后的字典', d)# 结果移动后的字典:OrderedDict([('message', 'success'), ('status', 200)])移动后的字典:OrderedDict([('status', 200), ('message', 'success')])
支持reversed相对于通常的映射方法,有序字典还另外提供了逆序迭代的支持,通过 reversed()
。d = OrderedDict({'status': 200, 'message': 'success'})print({key: value for key, value in reversed(d.items())})# 结果{'message': 'success', 'status': 200}
相等测试敏感OrderedDict
之间的相等测试是顺序敏感的d1 = OrderedDict({'status': 200, 'message': 'success'})d2 = OrderedDict({'message': 'success', 'status': 200})d3 = {'status': 200, 'message': 'success'}d4 = {'message': 'success', 'status': 200}print('OrderedDict之间的比较结果: ', d1 == d2)print('dict之间的比较结果: ', d3 == d4)print('OrderedDict与dict的比较结果: ', d1 == d3 == d4)# 结果OrderedDict之间的比较结果:Falsedict之间的比较结果:TrueOrderedDict与dict的比较结果:True
defaultdict返回一个新的类似字典的对象 。defaultdict
是内置 dict
类的子类 。它重载了一个方法并添加了一个可写的实例变量 。其余的功能与 dict
类相同defaultdict的作用我们看名字就知道
defaultdict
的作用是为字典提供一个默认的值,我们正常情况下访问一个字典的key,如果字典中没有这个key会报错>>> dict1 = {}>>> dict1['name']Traceback (most recent call last):File "<pyshell#1>", line 1, in <module>dict1['name']KeyError: 'name'>>>
此时我们就可以使用defaultdict
,它包含一个名为 default_factory
的属性,构造时,第一个参数用于为该属性提供初始值 , 默认为 None
。这个
default_factory
可以是list
、set
、str
, 也可以是自定义的函数,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ]
, str对应的是空字符串
,set对应set( )
,int对应0
dict1 = defaultdict(int)dict2 = defaultdict(set)dict3 = defaultdict(str)dict4 = defaultdict(list)print(dict1['name'])print(dict2['name'])print(dict3['name'])print(dict4['name'])
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 信号量 C# 多线程访问之 SemaphoreSlim【C# 进阶】
- 炉石传说新手攻略萌新到底怎么玩(炉石传说新手进阶流程)
- 38 全球名校AI课程库| 马萨诸塞大学 · 自然语言处理进阶课程『Advanced Natural Language Processing』
- Python基础指面向对象:2、动静态方法
- Python基础之面向对象:3、继承与派生
- ysoserial CommonsCollections2 分析
- 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
- Python处理刚刚,分钟,小时,天前等时间
- python渗透测试入门——取代netcat
- 六 Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待