模块 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 条评论) |