collections模块
在内置数据类型(dict
、list
、set
、tuple
)的基础上,collections
模块还提供了几个额外的数据类型:Counter
、deque
、defaultdict
、namedtuple
和OrderedDict
等
官方文档:https://docs.python.org/zh-cn/3/library/collections.html
namedtuple(具名元组)
创建命名元组子类的工厂函数
语法
collections.namedtuple(typename, field_names, verbose=False, rename=False)
- typename:元组名称
- field_names: 元组中元素的名称
- rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
- verbose: 默认就好
使用
from collections import namedtuple
point = namedtuple('坐标', ['x', 'y'])
p1 = point(11, 22)
p2 = point(33, 44)
print(p1, p2)
# 坐标(x=11, y=22) 坐标(x=33, y=44)
print(p1.x, p2.y)
# 11 44
person = namedtuple('人物', 'name age gender')
p1 = person('kevin', 22, 'male')
print(p1)
# 人物(name='kevin', age=22, gender='male')
print(p1.name)
# kevin
deque(双向队列)
类似列表list
的容器,实现了在两端快速添加append
和弹出pop
语法
class collections.deque([iterable[, maxlen]])
- iterable:迭代对象
- maxlen:可以增长到任意长度。否则,
deque
就限定到指定最大长度
双向队列deque
对象支持以下方法
支持方法 | 说明 |
---|---|
appen(x) |
添加 x 到右端 |
appendleft(x) |
添加 x 到左端 |
clear() |
移除所有元素,使其长度为0 |
copy() |
创建一份浅拷贝 |
count(x) |
计算 deque 中元素等于 x 的个数 |
extend(iterable) |
扩展deque 的右侧,通过添加 iterable 参数中的元素 |
extendleft(iterable) |
扩展deque 的左侧,通过添加 iterable 参数中的元素 |
index(x) |
返回 x 在 deque 中的位置,如果未找到则报错 |
insert(i, x) |
在位置 i 插入 x |
pop() |
移去并且返回一个元素,deque 最右侧的那一个,没有则报错 |
popleft() |
移去并且返回一个元素,deque 最左侧的那一个,没有则报错 |
remove(value) |
移除找到的第一个 value,没有则报错 |
reverse() |
将deque 逆序排列。返回 None |
rotate(n=1) |
向右循环移动 n 步。 如果 n 是负数,就向左循环 |
maxlen |
Deque 的最大尺寸,如果没有限定的话就是 None |
使用
from collections import deque
d = deque([1, 2, 3])
print(d)
# deque([1, 2, 3])
d.append(4) # 右边添加元素
print(d)
# deque([1, 2, 3, 4])
d.appendleft(5)
print(d)
d.pop()
print(d)
# deque([5, 1, 2, 3])
d.popleft()
print(d)
# deque([1, 2, 3])
OrderedDict(有序字典)
正常的字典内部是无序的(在py3.6 以后,字典默认为有序了)在对字典做迭代的时候,无法确定key
的顺序,利用OrdereadDict
可以保持字典的顺序
from collections import OrderedDict
my_dict = OrderedDict()
my_dict['name'] = 'kevin'
my_dict['age'] = 22
my_dict['gender'] = 'male'
my_dict['salary'] = 10000
for key, values in my_dict.items():
print(key, values)
# name kevin
# age 22
# gender male
# salary 10000
注意
有序字典的作用只是记住元素插入顺序并按顺序输出。如果有序字典中的元素一开始就定义好了,后面没有插入元素这一动作,那么遍历有序字典,其输出结果仍然是无序的,因为缺少了有序插入这一条件,所以此时有序字典就失去了作用,所以有序字典一般用于动态添加并需要按添加顺序输出的时候
defaultdict (默认字典)
当字典里的key
不存在但被查找时,会报错keyError
,利用defaultdict
可以返回的不是keyError
而是一个默认值
语法
defaultdict( factory_function)
- factory_function:可以是
list
、set
、str
等等
使用
from collections import defaultdict
my_dict1 = defaultdict(int)
my_dict2 = defaultdict(str)
my_dict3 = defaultdict(list)
my_dict4 = defaultdict(set)
my_dict5 = defaultdict(tuple)
my_dict1[1] = 'one'
print(my_dict1[0])
# 0
print(my_dict2[0])
#
print(my_dict3[0])
# []
print(my_dict4[0])
# set ()
print(my_dict5[0])
# ()
Counter(计数工具)
用来计算出现的次数,并且是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key
,其计数作为value
。计数值可以是任意的Interger
(包括0和负数)
语法
Counter(iterable)
- iterable:迭代器对象
使用
from collections import Counter
s = 'aaaabbbbcdde'
print(Counter(s))
# Counter({'a': 4, 'b': 4, 'd': 2, 'c': 1, 'e': 1})