26 python进阶collections标准库( 二 )

dict 类获得了记住插入顺序的能力(在 Python 3.7 中保证了这种新行为),它们变得不那么重要了 。
与dict类的区别

  • 常规的 dict 被设计为非常擅长映射操作 。跟踪插入顺序是次要的
  • OrderedDict 擅长重新排序操作 。空间效率、迭代速度和更新操作的性能是次要的 。
  • 算法上,OrderedDict 可以比 dict 更好地处理频繁的重新排序操作 。这使其适用于跟踪最近的访问(例如在 LRU cache 中) 。
  • 对于 OrderedDict ,相等操作检查匹配顺序 。
  • OrderedDict 类的 popitem() 方法有不同的签名 。它接受一个可选参数来指定弹出哪个元素 。
  • OrderedDict 类有一个 move_to_end() 方法 , 可以有效地将元素移动到任一端 。
  • Python 3.8之前,dict 缺少 __reversed__() 方法 。
popitem(last=True)有序字典的 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的比较结果:Truedefaultdict返回一个新的类似字典的对象 。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可以是listsetstr , 也可以是自定义的函数,作用是当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'])

推荐阅读