collections.OrderedDict – 容器数据类型(31)Python语言(必读进阶学习教程)(参考资料)
有序字典就像普通字典一样,但有一些与排序操作相关的额外功能。现在它们变得不那么重要了,因为内置dict
类获得了记住插入顺序的能力(这种新行为在 Python 3.7 中得到保证)。
dict
仍然存在一些差异:
常规字典被设计成非常擅长映射操作。 跟踪插入顺序是次要的。
OrderedDict 旨在擅长重新排序操作。 空间效率、迭代速度和更新操作的性能是次要的。
- 在算法上,OrderedDict 可以比 dict 更好地处理频繁的重新排序操作。 这使其适用于跟踪最近的访问(例如在 LRU 缓存中)。
OrderedDict
检查匹配顺序的相等操作。- OrderedDict 的 popitem() 方法具有不同的签名。 它接受一个可选参数来指定弹出哪个项目。
OrderedDict 有一个 move_to_end() 方法可以有效地将元素重新定位到端点。
- 在 Python 3.8 之前,dict 缺少 __reversed__() 方法。
- class
collections.
OrderedDict
([items]) - 返回一个子类的实例,该
dict
子类具有专门用于重新排列字典顺序的方法。3.1 版中的新功能。
last=Truepopitem(
)
- 有序字典的 popitem() 方法返回和删除 (key, value) 对。 如果 last 为真,则按 LIFO 顺序返回这些对,如果为假,则按 FIFO 顺序返回。
keymove_to_end(
last=True,
)
- 将现有键移动到有序字典的任一端。 如果 last 为 true(默认值),则项目移动到右端;如果 last 为 false,则项目移动到开头。 如果密钥不存在则引发 KeyError:
>>> d = OrderedDict.fromkeys('abcde') >>> d.move_to_end('b') >>> ''.join(d.keys()) 'acdeb' >>> d.move_to_end('b', last=False) >>> ''.join(d.keys()) 'bacde'
除了通常的映射方法之外,有序字典还支持使用 reversed() 进行反向迭代。
OrderedDict 对象之间的相等性测试是顺序敏感的,并且实现为 list(od1.items())==list(od2.items())。 OrderedDict 对象和其他 Mapping 对象之间的相等性测试与常规词典一样对顺序不敏感。 这允许在使用常规字典的任何地方替换 OrderedDict 对象。
在 3.5 版更改:OrderedDict 的项、键和值视图现在支持使用 reversed() 进行反向迭代。
在 3.6 版更改:随着 PEP 468 的接受,保留传递给 OrderedDict 构造函数及其 update() 方法的关键字参数的顺序。
OrderedDict 示例和方法
创建一个有序的字典变体很简单,它可以记住上次插入键的顺序。 如果一个新的条目覆盖了一个现有的条目,原来的插入位置被改变并移动到末尾:
class LastUpdatedOrderedDict(OrderedDict): 'Store items in the order the keys were last added' def __setitem__(self, key, value): super().__setitem__(key, value) super().move_to_end(key)
OrderedDict 也可用于实现 functools.lru_cache() 的变体:
class LRU(OrderedDict): 'Limit size, evicting the least recently looked-up key when full' def __init__(self, maxsize=128, *args, **kwds): self.maxsize = maxsize super().__init__(*args, **kwds) def __getitem__(self, key): value = super().__getitem__(key) self.move_to_end(key) return value def __setitem__(self, key, value): super().__setitem__(key, value) if len(self) > self.maxsize: oldest = next(iter(self)) del self[oldest]