collections中包含很多数据结构类,可以更方便地操作数据。

deque

Python 中可以用 deque 创建双端队列。

:::info 双端队列:同时具有栈和队列的特征,两端都可以增删元素,但不能在中间增删。 :::

  1. from collections import deque
  2. dq = deque() # 创建一个空的双端队列
  3. dq = deque(序列) # 从已有序列创建双端队列
  4. dq.append('element') # 在队尾添加元素
  5. dq.appendleft('element') # 在队首添加元素
  6. ele = dq.pop() # 删除队尾元素并返回
  7. ele = dq.popleft() # 删除队首元素并返回

deque 在字节码级别就是线程安全的,所以常用来存储线程间共享的数据。

Counter

对序列元素计数,计数结果可以转化为字典或双值子序列。

  1. from collections import Counter
  2. breakfast = ['spam', 'spam', 'eggs', 'spam']
  3. breakfast_counter = Counter(breakfast)
  4. print(breakfast_counter) # output: Counter({'spam': 3, 'eggs': 1})
  5. print(breakfast_counter.most_common()) # output: [('spam', 3), ('eggs', 1)] 可以得到双值子序列
  6. print(breakfast_counter.most_common(1)) # output: [('spam', 3)] 可以得到出现次数最多的元素及其次数
  7. lunch = ['eggs', 'eggs', 'bacon']
  8. lunch_counter = Counter(lunch)
  9. print(dict(lunch_counter)) # output: {'eggs': 2, 'bacon': 1}
  10. print(breakfast_counter + lunch_counter) # 计数器可以相加,得到合并后的计数结果
  11. print(breakfast_counter - lunch_counter) # 计数器也可以相减

OrderedDict

由于字典是无序的,所以有些时候可能得不到想要的结果,因此 Python 提供了 OrderedDict 类用来创建有序字典。

  1. from collections import OrderedDict
  2. # 与 dict() 相似,参数是一个双值子序列或一个字典或其他情况
  3. quotes = OrderedDict([('Moe', 'A wise guy, huh?'), ('Larry', 'Ow!'), ('Curly', 'Nyuk nyuk!')])

namedtuple

当想创建一个只有属性没有方法的类时,比如:

  1. class Student:
  2. def __init__(self, id, name, age):
  3. self.id = id
  4. self.name = name
  5. self.age = age

可以考虑用 namedtuple 代替:

  1. from collections import namedtuple
  2. Student = namedtuple('Student', 'id name age') # 创建 Student 类型
  3. st1 = Student(id=1, name='xiaoming', age=18) # 创建实例
  4. # 属性的调用方法与类相同
  5. st1.id
  6. st1.name
  7. st1.age

namedtuple 性能比类更好,但不能包含方法只能包含属性。