Python 数据处理神器:你真的会用 collections 吗?

129 阅读2分钟

关键词:Python、collections 模块、Counter、defaultdict、deque、namedtuple、OrderedDict


一、什么是 collections

Python 的 collections 模块内置了多个增强型数据结构,相比普通的 listdictset 等,它们更灵活、功能更强,常用于数据分析、日志处理、状态跟踪、性能优化等场景


二、最常用的五大数据结构解析


1️⃣ Counter:快速统计元素频次

python
复制编辑
from collections import Counter

words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(words)

print(counter)
# Counter({'apple': 3, 'banana': 2, 'orange': 1})

print(counter.most_common(2))
# [('apple', 3), ('banana', 2)]

应用场景:

  • 日志中统计错误类型频次
  • 词频分析
  • 投票计数器

2️⃣ defaultdict:避免 KeyError 的救星

python
复制编辑
from collections import defaultdict

d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)

print(d)
# defaultdict(<class 'list'>, {'a': [1, 2], 'b': [3]})

对比普通 dict:

python
复制编辑
d = {}
d['a'].append(1)  # ❌ 报错 KeyError

应用场景:

  • 构建倒排索引
  • 分组聚合数据
  • 多值映射表

3️⃣ deque:高性能的双端队列

python
复制编辑
from collections import deque

q = deque([1, 2, 3])
q.appendleft(0)
q.append(4)
print(q)  # deque([0, 1, 2, 3, 4])

q.pop()
q.popleft()
print(q)  # deque([1, 2, 3])

优势:

  • 相比 list,deque 在头尾插入/删除元素效率更高(O(1))

应用场景:

  • 队列、栈、滑动窗口
  • 最近访问缓存(LRU Cache)

4️⃣ namedtuple:可读性 + 内存优化的类替代品

python
复制编辑
from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)

print(p.x, p.y)  # 1 2
print(p)         # Point(x=1, y=2)

应用场景:

  • 替代小型类
  • 返回结构化数据
  • CSV/日志解析成结构对象

5️⃣ OrderedDict(Python 3.7+已内置)

python
复制编辑
from collections import OrderedDict

d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3

for k in d:
    print(k, end=' ')  # a b c

虽然 Python 3.7+ 默认 dict 就是有序的,但 OrderedDict 仍支持:

  • move_to_end() :重排元素
  • popitem(last=False) :弹出第一个元素

适用场景:

  • 实现 LRU 缓存
  • 保存配置加载顺序
  • 数据结构中需要可控顺序的操作

三、综合实战示例:分析学生考试成绩

python
复制编辑
from collections import defaultdict, Counter

scores = [
    ('Tom', 'math', 85),
    ('Tom', 'english', 90),
    ('Jerry', 'math', 78),
    ('Jerry', 'english', 88),
    ('Anna', 'math', 95),
]

# 按学生聚合科目成绩
result = defaultdict(dict)
for name, subject, score in scores:
    result[name][subject] = score

print(result)
# {'Tom': {'math': 85, 'english': 90}, ...}

# 统计每门课的平均分
subject_scores = defaultdict(list)
for _, subject, score in scores:
    subject_scores[subject].append(score)

for subject, lst in subject_scores.items():
    avg = sum(lst) / len(lst)
    print(f"{subject} 平均分: {avg:.2f}")

四、小结与建议

工具作用
Counter频次统计、排行榜
defaultdict安全聚合、分组统计
deque队列、栈、滑动窗口、缓存
namedtuple结构数据简化版 class
OrderedDict控制数据顺序、高级 dict 操作

💬互动话题:

你最喜欢 collections 中哪个工具?有没有在实际项目中用过这些数据结构?留言聊聊吧! 文章来源:mip.chkairui.com