# 1. 导入方式

import collections

# 2. 常用数据结构

# 1. Counter — 计数

  • 功能:统计元素出现的次数。
  • 类似 dict,但是专门用于计数。
from collections import Counter

lst = ['a', 'b', 'a', 'c', 'b', 'a']
cnt = Counter(lst)
print(cnt)  # Counter({'a': 3, 'b': 2, 'c': 1})
print(cnt.most_common(2))  # [('a', 3), ('b', 2)]

# 2. defaultdict — 带默认值的字典

  • 功能:访问不存在的 key 不会报错,会返回默认值。
  • 构造时传入一个函数(如 intlistset)作为默认值。
from collections import defaultdict

d = defaultdict(int)  # 默认值是 0
d['a'] += 1
print(d['a'])  # 1
print(d['b'])  # 0

d2 = defaultdict(list)
d2['x'].append(10)
print(d2['x'])  # [10]

在你之前的 mask_outlier 代码里:

index2label = collections.defaultdict(int)

就是用 int 作为默认值 0,统计每个标签出现的次数。


# 3. OrderedDict — 有序字典

  • 功能:保持 key 的插入顺序。
  • Python 3.7+ 的普通 dict 已经默认保持顺序,所以用途不如以前重要,但有些方法如 move_to_end 仍很有用。
from collections import OrderedDict

od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(list(od.keys()))  # ['a', 'b', 'c']
od.move_to_end('b')
print(list(od.keys()))  # ['a', 'c', 'b']

# 4. deque — 双端队列

  • 功能:可以高效地从两端插入和删除元素。
  • 操作复杂度 O(1),比 list 从左端插入快。
from collections import deque

q = deque([1, 2, 3])
q.append(4)      # 右端添加
q.appendleft(0)  # 左端添加
print(q)         # deque([0, 1, 2, 3, 4])
q.pop()          # 右端删除
q.popleft()      # 左端删除

# 5. namedtuple — 命名元组

  • 功能:给元组的每个元素命名,既可以像元组一样索引,也可以用属性名访问。
  • 用于存储轻量对象。
from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x)  # 10
print(p[1]) # 20

# 3. 小结

数据结构 特点 典型用途
Counter 计数 元素频率统计
defaultdict key 不存在返回默认值 聚合统计、累加
OrderedDict 保持插入顺序 需要顺序字典
deque 双端队列,高效两端操作 队列、滑动窗口
namedtuple 命名元组,访问像对象又像元组 简单对象存储