defaultdict
获取元素,不存在则为空
return dict.get(key, None)
处理元组插入字典,自动合并键值
data = [(1, 3), (2, 1), (1, 4), (2, 5), (3, 7)]
d = {}
from collections import defaultdict
d = defaultdict(list)
for k, v in data:
d[k].append(v)
使用defaultdict之后,如果key不存在,容器会自动返回我们预先设置的默认值。需要注意的是defaultdict传入的默认值可以是一个类型也可以是一个方法。如果我们传入int,那么默认值会被设置成int()的结果,也就是0,如果我们想要自定义或者修改,我们可以传入一个方法,比如:
d = defaultdict(lambda: 3)
for k, v in data:
d[k] += v
# {1: 10, 2: 9, 3: 10})
Counter
用于数数和排序,我们直接将一个list传入Counter中作为参数,它会自动为我们替当中的每个元素计数。比如:
words = ['apple', 'apple', 'pear', 'watermelon', 'pear', 'peach']
from collections import Counter
counter = Counter(words)
>>> print(counter)
Counter({'apple': 2, 'pear': 2, 'watermelon': 1, 'peach': 1})
如果我们要筛选topK,也非常简单,它为我们提供了most_common方法,我们只需要传入需要求的K即可:
counter.most_common(1)
# [('apple', 2)]
它也支持dict类型,我们可以通过一个value是int的dict来初始化一个Counter
c = Counter({'apple': 5, 'pear': 4})
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。
from collections import deque
dque = deque(maxlen=10)
# 假设我们想要从文件当中获取最后10条数据
for i in f.read():
dque.append(i)
nametuple
namedtuple是一个非常简单的元类,通过它我们可以非常方便地定义我们想要的类
class Student:
def __init__(self, name=None, score=None, age=None):
self.name = name
self.score = score
self.age = age
# 简化代码
from collections import namedtuple
# 这个是类,columns也可以写成'name score age',即用空格分开
Student = namedtuple('Student', ['name', 'score', 'age'])
# 这个是实例
student = Student(name='xiaoming', score=99, age=10)
print(student.name)
通过使用namedtuple,我们只需要一行就定义了一个类,但是这样定义的类是没有缺失值的,但是namedtuple很强大,我们可以通过传入defaults参数来定义缺失值。
# 在Python的规范当中,必选参数一定在可选参数前面。所以nuamdtuple会自动右对齐。
Student = namedtuple('Student', ['name', 'score', 'age'], defaults=(0, 0))