# 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 不会报错,会返回默认值。
- 构造时传入一个函数(如
int、list、set)作为默认值。
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 | 命名元组,访问像对象又像元组 | 简单对象存储 |
