collections模块

在内置数据类型(dictlistsettuple)的基础上,collections模块还提供了几个额外的数据类型:CounterdequedefaultdictnamedtupleOrderedDict

官方文档:https://docs.python.org/zh-cn/3/library/collections.html

namedtuple(具名元组)

创建命名元组子类的工厂函数

语法

  1. collections.namedtuple(typename, field_names, verbose=False, rename=False)
  • typename:元组名称
  • field_names: 元组中元素的名称
  • rename: 如果元素名称中含有 python 的关键字,则必须设置为 rename=True
  • verbose: 默认就好

使用

  1. from collections import namedtuple
  2. point = namedtuple('坐标', ['x', 'y'])
  3. p1 = point(11, 22)
  4. p2 = point(33, 44)
  5. print(p1, p2)
  6. # 坐标(x=11, y=22) 坐标(x=33, y=44)
  7. print(p1.x, p2.y)
  8. # 11 44
  9. person = namedtuple('人物', 'name age gender')
  10. p1 = person('kevin', 22, 'male')
  11. print(p1)
  12. # 人物(name='kevin', age=22, gender='male')
  13. print(p1.name)
  14. # kevin

deque(双向队列)

类似列表list的容器,实现了在两端快速添加append和弹出pop

语法

  1. 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

使用

  1. from collections import deque
  2. d = deque([1, 2, 3])
  3. print(d)
  4. # deque([1, 2, 3])
  5. d.append(4) # 右边添加元素
  6. print(d)
  7. # deque([1, 2, 3, 4])
  8. d.appendleft(5)
  9. print(d)
  10. d.pop()
  11. print(d)
  12. # deque([5, 1, 2, 3])
  13. d.popleft()
  14. print(d)
  15. # deque([1, 2, 3])

OrderedDict(有序字典)

正常的字典内部是无序的(在py3.6 以后,字典默认为有序了)在对字典做迭代的时候,无法确定key的顺序,利用OrdereadDict可以保持字典的顺序

  1. from collections import OrderedDict
  2. my_dict = OrderedDict()
  3. my_dict['name'] = 'kevin'
  4. my_dict['age'] = 22
  5. my_dict['gender'] = 'male'
  6. my_dict['salary'] = 10000
  7. for key, values in my_dict.items():
  8. print(key, values)
  9. # name kevin
  10. # age 22
  11. # gender male
  12. # salary 10000

注意

有序字典的作用只是记住元素插入顺序并按顺序输出。如果有序字典中的元素一开始就定义好了,后面没有插入元素这一动作,那么遍历有序字典,其输出结果仍然是无序的,因为缺少了有序插入这一条件,所以此时有序字典就失去了作用,所以有序字典一般用于动态添加并需要按添加顺序输出的时候

defaultdict (默认字典)

当字典里的key不存在但被查找时,会报错keyError,利用defaultdict可以返回的不是keyError而是一个默认值

语法

  1. defaultdict( factory_function)
  • factory_function:可以是listsetstr等等

使用

  1. from collections import defaultdict
  2. my_dict1 = defaultdict(int)
  3. my_dict2 = defaultdict(str)
  4. my_dict3 = defaultdict(list)
  5. my_dict4 = defaultdict(set)
  6. my_dict5 = defaultdict(tuple)
  7. my_dict1[1] = 'one'
  8. print(my_dict1[0])
  9. # 0
  10. print(my_dict2[0])
  11. #
  12. print(my_dict3[0])
  13. # []
  14. print(my_dict4[0])
  15. # set ()
  16. print(my_dict5[0])
  17. # ()

Counter(计数工具)

用来计算出现的次数,并且是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)

语法

  1. Counter(iterable)
  • iterable:迭代器对象

使用

  1. from collections import Counter
  2. s = 'aaaabbbbcdde'
  3. print(Counter(s))
  4. # Counter({'a': 4, 'b': 4, 'd': 2, 'c': 1, 'e': 1})