字典的变种
这一节总结了标准库里 collections 模块中,除了 defaultdict 之外
的不同映射类型。
collections.OrderedDict
这个类型在添加键的时候会保持顺序,因此键的迭代次序总是一致 的。OrderedDict 的 popitem 方法默认删除并返回的是字典里的最后 一个元素,但是如果像 my_odict.popitem(last=False) 这样调用 它,那么它删除并返回第一个被添加进去的元素。
collections.ChainMap
该类型可以容纳数个不同的映射对象,然后在进行键查找操作的时 候,这些对象会被当作一个整体被逐个查找,直到键被找到为止。这个 功能在给有嵌套作用域的语言做解释器的时候很有用,可以用一个映射 对象来代表一个作用域的上下文。在 collections 文档介绍 ChainMap 对象的那一部分 (https://docs.python.org/3/library/collections.html#collections.ChainMap) 里有一些具体的使用示例,其中包含了下面这个 Python 变量查询规则的 代码片段:
collections.Counter
这个映射类型会给键准备一个整数计数器。每次更新一个键的时候 都会增加这个计数器。所以这个类型可以用来给可散列表对象计数,或 者是当成多重集来用——多重集合就是集合里的元素可以出现不止一 次。Counter 实现了 + 和 - 运算符用来合并记录,还有像 most_common([n]) 这类很有用的方法。most_common([n]) 会按照次 序返回映射里最常见的 n 个键和它们的计数,详情参阅文档 (https://docs.python.org/3/library/collections.html#collections.Counter)。
import builtins
pylookup = ChainMap(locals(), globals(), vars(builtins))
下面的小例子利用 Counter 来计算单词中各个字母出现的次数:
>>> ct = collections.Counter('abracadabra')
>>> ct
Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
>>> ct.update('aaaaazzz')
>>> ct
Counter({'a': 10, 'z': 3, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
>>> ct.most_common(2)
[('a', 10), ('z', 3)]
colllections.UserDict
这个类其实就是把标准 dict 用纯 Python 又实现了一遍。
posted on
浙公网安备 33010602011771号