Pythoncollections模块深究

张开发
2026/6/8 11:42:52 15 分钟阅读

分享文章

Pythoncollections模块深究
Python collections 模块深究collections 提供内置容器的替代方案, 大幅提升代码效率与可读性.1. deque — 双端队列-------------------deque 支持两端 O(1) 的追加与弹出, 适合队列/栈/滑动窗口.from collections import deque# 创建固定长度的队列, maxlen 限制最大元素数d deque(maxlen5)for i in range(10):d.append(i) # 右侧追加, 超出 maxlen 自动丢弃左侧print(deque 自动丢弃左侧:, list(d)) # [5,6,7,8,9]# rotate 旋转: 正数右移, 负数左移d2 deque([1, 2, 3, 4, 5])d2.rotate(2) # 后两个元素移到前面print(rotate 右移2:, list(d2)) # [4,5,1,2,3]d2.rotate(-1) # 第一个元素移到末尾print(rotate 左移1:, list(d2)) # [5,1,2,3,4]# 两端操作d3 deque()d3.append(1) # 右侧追加d3.appendleft(2) # 左侧追加d3.extend([3, 4]) # 右侧批量追加d3.extendleft([5]) # 左侧批量追加 (注意顺序反转)print(两端操作:, list(d3)) # [5,2,1,3,4]d3.pop() # 弹出右侧d3.popleft() # 弹出左侧2. ChainMap — 作用域链式查找------------------------------ChainMap 将多个字典合并为一个逻辑视图, 查找按顺序扫描.from collections import ChainMapdefaults {color: red, size: medium, theme: light}user_prefs {color: blue, size: large}runtime_args {color: green}# 优先级: runtime user defaultschain ChainMap(runtime_args, user_prefs, defaults)print(ChainMap 查找 color:, chain[color]) # green (runtime)print(ChainMap 查找 theme:, chain[theme]) # light (defaults)# 新增/修改只作用于第一个映射chain[width] 100print(新增在第一个映射:, runtime_args) # {color: green, width: 100}# .maps 查看所有层, .parents 跳过第一层print(所有映射层:, chain.maps)print(跳过第一层:, chain.parents[color]) # blue (user_prefs)3. Counter — 高级计数-----------------------Counter 是 dict 子类, 专为计数场景设计.from collections import Counterwords [a, b, a, c, c, c, d]cnt Counter(words)# most_common 按频次降序返回前N个print(最常见元素:, cnt.most_common(2)) # [(c, 3), (a, 2)]# subtract 元素相减, 允许出现零或负数cnt2 Counter(a1, c2, e1)cnt.subtract(cnt2)print(相减后:, cnt) # Counter({b: 1, d: 1, a: 0, c: -1, e: -1})# elements 按频次展开每个元素 (忽略 0 的)cnt3 Counter(a3, b1, c0)print(elements 展开:, list(cnt3.elements())) # [a, a, a, b]# Counter 支持算术运算c4 Counter(a3, b1)c5 Counter(a1, b2)print(相加:, c4 c5) # Counter({a: 4, b: 3})print(相减(保留正数):, c4 - c5) # Counter({a: 2})print(交集:, c4 c5) # Counter({a: 1, b: 1})print(并集:, c4 | c5) # Counter({a: 3, b: 2})4. OrderedDict — 有序字典--------------------------维护插入顺序, move_to_end / popitem 控制元素位置.from collections import OrderedDictod OrderedDict()od[z] 1od[a] 2od[m] 3# move_to_end 将指定键移到末尾或开头od.move_to_end(z) # z 移到最后print(move_to_end:, list(od.keys())) # [a, m, z]od.move_to_end(z, lastFalse) # z 移到最前print(move_to_end lastFalse:, list(od.keys())) # [z, a, m]# popitem 弹出并返回键值对, lastTrue 弹出最后一个item od.popitem(lastTrue)print(popitem 末尾:, item) # (m, 3)item od.popitem(lastFalse)print(popitem 开头:, item) # (z, 1)5. defaultdict — 默认值工厂-----------------------------访问缺失键时自动调用工厂函数生成默认值.from collections import defaultdict# 列表工厂: 自动分组group defaultdict(list)for key, val in [(a, 1), (b, 2), (a, 3)]:group[key].append(val)print(自动分组:, dict(group)) # {a: [1, 3], b: [2]}# int 工厂: 自动计数counter defaultdict(int)for ch in hello world:counter[ch] 1print(自动计数:, dict(counter))# set 工厂: 集合去重unique defaultdict(set)unique[a].add(1)unique[a].add(1) # 重复添加被忽略print(集合去重:, dict(unique))# 自定义工厂nested defaultdict(lambda: defaultdict(list))nested[user1][items].append(book)print(嵌套字典:, dict(nested))6. namedtuple — 命名元组-------------------------轻量级不可变数据结构, 支持默认值和重命名字段.from collections import namedtuple# defaults 提供默认值 (从右向左匹配)Point namedtuple(Point, [x, y, z], defaults[0, 0])p1 Point(1, 2)print(命名元组:, p1.x, p1.y, p1.z) # 1 2 0# renameTrue 自动重命名非法字段名Person namedtuple(Person, [name, class, def], renameTrue)print(重命名后的字段:, Person._fields) # (name, _1, _2)7. UserDict / UserList / UserString-------------------------------------继承这些类更方便地自定义容器行为.from collections import UserDict, UserList, UserString# UserDict: 自定义字典行为class CaseInsensitiveDict(UserDict):def __setitem__(self, key, value):super().__setitem__(key.lower(), value)def __getitem__(self, key):return super().__getitem__(key.lower())cid CaseInsensitiveDict()cid[Name] Aliceprint(不区分大小写:, cid[name]) # Alice# UserList: 自定义列表行为class FilteredList(UserList):def append(self, item):if item 0:super().append(item)fl FilteredList([1, -2, 3])fl.append(-5) # 被过滤print(过滤后的列表:, fl) # [1, -2, 3]# UserString: 自定义字符串行为class PrefixString(UserString):def __init__(self, seq):super().__init__(fprefix_{seq})ps PrefixString(test)print(自定义字符串:, ps) # prefix_test总结: collections 模块是日常开发中处理数据结构的利器, 合理使用可显著减少模板代码.

更多文章