defaultdict

获取元素,不存在则为空

  1. return dict.get(key, None)

处理元组插入字典,自动合并键值

  1. data = [(1, 3), (2, 1), (1, 4), (2, 5), (3, 7)]
  2. d = {}
  3. from collections import defaultdict
  4. d = defaultdict(list)
  5. for k, v in data:
  6. d[k].append(v)

使用defaultdict之后,如果key不存在,容器会自动返回我们预先设置的默认值。需要注意的是defaultdict传入的默认值可以是一个类型也可以是一个方法。如果我们传入int,那么默认值会被设置成int()的结果,也就是0,如果我们想要自定义或者修改,我们可以传入一个方法,比如:

  1. d = defaultdict(lambda: 3)
  2. for k, v in data:
  3. d[k] += v
  4. # {1: 10, 2: 9, 3: 10})

Counter

用于数数和排序,我们直接将一个list传入Counter中作为参数,它会自动为我们替当中的每个元素计数。比如:

  1. words = ['apple', 'apple', 'pear', 'watermelon', 'pear', 'peach']
  2. from collections import Counter
  3. counter = Counter(words)
  4. >>> print(counter)
  5. Counter({'apple': 2, 'pear': 2, 'watermelon': 1, 'peach': 1})

如果我们要筛选topK,也非常简单,它为我们提供了most_common方法,我们只需要传入需要求的K即可:

  1. counter.most_common(1)
  2. # [('apple', 2)]

它也支持dict类型,我们可以通过一个value是int的dict来初始化一个Counter

  1. c = Counter({'apple': 5, 'pear': 4})
  2. c = Counter(apple=4, pear=3)

并且,它还支持加减法的操作,比如我们可以将两个Counter相加,它会自动将两个Counter合并,相同的key对应的value累加。相减也是同理,会将能对应的value做减法,被减的key对应不上的会保留,而减数中对应不上的key则会被丢弃。并且需要注意,Counter支持value为负数。

deque

deque是双端队列,队首和队尾都支持弹出

在日常的使用当中,真正用到双端队列的算法其实不太多。大多数情况下我们使用deque主要有两个原因,第一个原因是deque受到GIL的管理,它是线程安全的。而list则没有GIL锁,因此不是线程安全的。也就是说在并发场景下,list可能会导致一致性问题,而deque不会。另一个原因是deque支持固定长度,当长度满了之后,当我们继续append时,它会自动弹出最早插入的数据。

比如说当我们拥有海量的数据,我们不知道它的数量,但是想要保留最后出现的指定数量的数据的时候,就可以使用deque。

  1. from collections import deque
  2. dque = deque(maxlen=10)
  3. # 假设我们想要从文件当中获取最后10条数据
  4. for i in f.read():
  5. dque.append(i)

nametuple

namedtuple是一个非常简单的元类,通过它我们可以非常方便地定义我们想要的类

  1. class Student:
  2. def __init__(self, name=None, score=None, age=None):
  3. self.name = name
  4. self.score = score
  5. self.age = age
  6. # 简化代码
  7. from collections import namedtuple
  8. # 这个是类,columns也可以写成'name score age',即用空格分开
  9. Student = namedtuple('Student', ['name', 'score', 'age'])
  10. # 这个是实例
  11. student = Student(name='xiaoming', score=99, age=10)
  12. print(student.name)

通过使用namedtuple,我们只需要一行就定义了一个类,但是这样定义的类是没有缺失值的,但是namedtuple很强大,我们可以通过传入defaults参数来定义缺失值。

  1. # 在Python的规范当中,必选参数一定在可选参数前面。所以nuamdtuple会自动右对齐。
  2. Student = namedtuple('Student', ['name', 'score', 'age'], defaults=(0, 0))