Python 模块 Collections

模块 collections 提供了一些数据类型的容器。

collections 提供的容器要比 Python 内置类型如列表、元组和字典功能更加丰富。

ChainMap 多个字典中搜索

类 ChainMap 能够管理多个字典(dict),在其中按顺序搜索指定的键(keys)和值(values)。一个 ChainMap 可以看做是管理多个字典的上下文,因为它能够像栈(stack)一样伸缩。

访问值

ChainMap 能够像单个字典一样访问值。

执行:

排序

ChainMap 包含多个字典,它使用属性 maps 存储字典的一个列表,如果多个字典中有重复的键(key),那么将使用排在列表前面的字典。

执行:

这个例子中,更新了 maps 属性,使 ChainMap 的字典数据倒序排序,查看输出,第一次键 a=1 , maps 更新后 a=3。

更新值

因为 ChainMap 不缓存内部字典的值,所以当字典更新时,ChainMap 也更新。

执行:

上面的例子更新的是内部的字典,也可以直接更新 ChainMap。

执行:

new_child() 方法

返回一个新的 ChainMap 包含当前实例的所有数据。方法还接收一个参数,用来更新 ChainMap 的数据而不修改之前的。

执行:

本例中,调用 new_child(c) ,相当于:collections.ChainMap(c, *m.maps)。

Counter 容器

Counter 是一个容器,它根据哈希值跟踪加入容器中的数据的次数。

实例化

Counter 支持三种形式的实例化,它的构造器可以接收一个序列,字典或者以关键字参数传入。

执行:

你也可以先不传任何参数,然后调用 update() 方法更新。

执行:

访问值

执行:

当访问一个不存在的值时,不会触发异常,而是返回0

elements() 方法返回一个迭代器,包含 ChainMap 的所有元素。

most_common() 按照顺序返回最常用的前n个元素,包含次数。如果不传参数,则返回所有的。

执行:

算术运算

Counter 和集合一样支持算术运算。

执行:

defaultdict

内置的字典类型提供了方法 setdefault() 返回指定键的值。如果键存在,则只返回值,并不设置新值。如果键不存在,则设置后,返回新值。

defaultdict 接收一个提供默认值的函数,如果字典不存在键值,则调用默认函数返回默认值。

执行:

defaultdict 第一个参数提供了返回默认值的函数。

deque 双向队列

双向队列(double-ended queue)deque 支持在队列首尾添加或者删除元素,而栈(stack)和 队列(queue)是单向的,只能在一端操作。

执行:

因为 deque 是一个序列的容器,可以像列表一样,通过索引访问元素。

remove() 方法从队列删除指定的元素,注意它不会删除所有的,上例中,删除了一个 3,最后的3保留了下来。当元素不存在时,会触发异常 ValueError。

双向操作

执行:

上例中,通过 extend() 和 append() 方法从 deque 结尾添加元素,extendleft() 和 appendleft() 在开头添加元素。

方法 popleft() 和 pop() 还可以从首尾删除元素。

执行:

移动数据

deque 的另一个特性是沿着头和尾移动数据。

执行:

使用 rotate() 方法移动数据,当参数大于0时,移动方向由尾部向头部移动,小于0则相反。

限制队列大小

使用参数 maxlen 限制队列的大小。

执行:

上例中,队列最大有2个元素,当数量超过2时,会丢弃多余的数据。

命名元组

标准的元组 tuple 使用索引访问元素。

执行:

定义

当元组元素数量增多的时候,记住索引非常不方便。这个时候可以使用命名元组,通过名称访问每个元素。

执行:

namedtuple 第一个参数是元组名称,第二个参数以空格分隔每个属性。

namedtuple 和 tuple 一样,是不可修改的(immutable)。这样会有一致的哈希值,能够作为字典的键或者加入到集合中。

如果试图修改属性,会触发属性异常(AttributeError)。

特殊的属性

namedtuple 包含一些有用的属性和方法,都是以 _ 为开头,这是为了防止和用户自定义的属性冲突。

_fields 属性包含用户定义的属性序列。 _asdict() 方法返回一个 OrderedDict 实例,_replace() 方法创建一个新实例,可以通过参数更新旧的属性值。

执行:

OrderedDict

OrderedDict 会记住添加进字典的键的顺序。

执行:

Python 3.6 版本之前,普通的字典是不会记住添加的顺序的。查看上例的输出 OrderedDict 记住了添加进字典的键的顺序。

排序

方法 move_to_end() 移动指定的键到 OrderedDict 字典结尾。

执行:

move_to_end() 默认移动到结尾,你也可以传递参数 last=False 移动到开头。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();