【Python 工具人快餐 · 第 4 份】
开袋即食
collections 自带三件「数据小神器」:
• Counter:一行统计出现次数
• deque:双向队列,O(1) 头尾增删
• defaultdict:键不存在时自动给默认值,省掉 if 检查
1 行代码 3 连发
from collections import Counter, deque, defaultdictc = Counter("abracadabra") # Counter({'a': 5, 'b': 2, ...})
dq = deque(maxlen=3) # 自动丢弃旧元素
d = defaultdict(int) # 默认 0
场景实拍:实时滑动窗口 Top-3
需求:日志不断吐 IP,实时保留最近 1000 条并输出出现最多的 3 个 IP。
from collections import Counter, dequewindow = deque(maxlen=1000)
for ip in log_stream(): # 假设是个生成器window.append(ip)top3 = Counter(window).most_common(3)print(top3)
• deque 自动踢掉第 1001 条老记录
• Counter(window) 每次 O(n) 统计,数据量小可忽略
如需极致加速,可加 Counter.update / subtract 增量维护。
升级加料
- Counter 支持
+ - & |
:合并或取交集 - deque 支持
rotate(n)
快速旋转 - defaultdict 可嵌套:
dd = defaultdict(lambda: defaultdict(list))
打包带走
统计用 Counter,队列用 deque,缺值用 defaultdict——
别再用裸 dict 手撸轮子啦!