collections模块使用专业集装箱数据类型替代Python的通用内置数据类型,dict
,list
, set
,和tuple等
。
deque
所谓双端队列,就是两端都能操作,与Python内置的list区别在于:头部插入与删除的时间复杂度为O(1)
拥有几乎所有list的方法,但deque可以选择从左或者从右开始
还具备一些其他功能:
rotate:所有元素整体向左或右移动n个位置(如果n为负值,则向左)
reverse:反转所有元素位置
defaultdict接受一个工厂函数作为参数,如下来构造:
dict = defaultdict(factory_function)
这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set(),int对应0,如下举例:
from collections import defaultdict
dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
对应的值分别为:
0
set()
(空字符串)
[]
再一个例子:
members = [
# sex, name
['male', 'John'],
['male', 'Jack'],
['female', 'Lily'],
['male', 'Pony'],
['female', 'Lucy'],
]
result = defaultdict(list)
for sex, name in members:
result[sex].append(name)
print(result)
Counter
a sequence of items, a dictionary containing keys and counts, or using keyword arguments that map string names to counts.
提供了一种计数器工具来支持便捷而快速的计数。
Counter是dict的子类,所以操作同dict,在此基础上,又添加了most_common(),elements().
elements: 返回所有元素(原始不去重)的迭代器
most_common(): count前n的元素
OrderedDict:
dict这个数据结构由于hash的特性,是无序的,这在有的时候会给我们带来一些麻烦, 幸运的是,collections模块为我们提供了OrderedDict,当你要获得一个有序的字典对象时,用它就对了
Remember the Order Keys are Added to a Dictionary
python3.6之后也会对dict顺序做记录
OrderedDict作为dict子类,拥有大多dict的方法,另外增加了一些:move_to_end和clear
>>> p
OrderedDict([('b', 2), ('c', 3), ('apple', 4), ('banana', 5), ('cat', 6)])
# move_to_end
>>> p.move_to_end('b')
>>> p
OrderedDict([('c', 3), ('apple', 4), ('banana', 5), ('cat', 6), ('b', 2)])
>>> p.clear()
>>> p
OrderedDict()
namedtuple()
Tuple Subclass with Named Fields
namedtuple为每个成员分配名称以及数字索引,增强了按名称访问元素的可读性,尤其是当tuple数据长度很大时。
例子:
from collections import namedtuple
# 定义一个namedtuple类型User,并包含name,sex和age属性
User = namedtuple('User', ['name', 'sex', 'age'])
# 创建一个User对象
user = User(name='quincy', sex='male', age=24)
# 通过一个list来创建User对象,需使用“_make”方法
user = User._make(['quincy', 'male', 24])