当前位置: 首页 > news >正文

Pythoncollections模块深究

Python collections 模块深究
=============================

collections 提供内置容器的替代方案, 大幅提升代码效率与可读性.

1. deque — 双端队列
-------------------
deque 支持两端 O(1) 的追加与弹出, 适合队列/栈/滑动窗口.

from collections import deque

# 创建固定长度的队列, maxlen 限制最大元素数
d = deque(maxlen=5)
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 ChainMap

defaults = {"color": "red", "size": "medium", "theme": "light"}
user_prefs = {"color": "blue", "size": "large"}
runtime_args = {"color": "green"}

# 优先级: runtime > user > defaults
chain = ChainMap(runtime_args, user_prefs, defaults)
print("ChainMap 查找 color:", chain["color"]) # green (runtime)
print("ChainMap 查找 theme:", chain["theme"]) # light (defaults)

# 新增/修改只作用于第一个映射
chain["width"] = 100
print("新增在第一个映射:", 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 Counter

words = ["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(a=1, c=2, e=1)
cnt.subtract(cnt2)
print("相减后:", cnt) # Counter({'b': 1, 'd': 1, 'a': 0, 'c': -1, 'e': -1})

# elements 按频次展开每个元素 (忽略 <=0 的)
cnt3 = Counter(a=3, b=1, c=0)
print("elements 展开:", list(cnt3.elements())) # ['a', 'a', 'a', 'b']

# Counter 支持算术运算
c4 = Counter(a=3, b=1)
c5 = Counter(a=1, b=2)
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 OrderedDict

od = OrderedDict()
od["z"] = 1
od["a"] = 2
od["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", last=False) # z 移到最前
print("move_to_end last=False:", list(od.keys())) # ['z', 'a', 'm']

# popitem 弹出并返回键值对, last=True 弹出最后一个
item = od.popitem(last=True)
print("popitem 末尾:", item) # ('m', 3)
item = od.popitem(last=False)
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] += 1
print("自动计数:", 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

# rename=True 自动重命名非法字段名
Person = namedtuple("Person", ["name", "class", "def"], rename=True)
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"] = "Alice"
print("不区分大小写:", 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__(f"prefix_{seq}")

ps = PrefixString("test")
print("自定义字符串:", ps) # prefix_test

总结: collections 模块是日常开发中处理数据结构的利器, 合理使用可显著减少模板代码.

http://www.gsyq.cn/news/1416504.html

相关文章:

  • Arduino机器人平台:模式切换架构与多传感器集成实践
  • MATLAB音频处理应用开发:从参数均衡器到实时频谱分析
  • 导师推荐!2026年实力出众的专业AI智能降重工具 - 降AI小能手
  • 树莓派Pico入门:MicroPython控制LED闪烁原理与实践
  • ncmdump完全指南:专业解密网易云音乐NCM加密格式
  • AI 内容安全写法:AIGC 初稿 + 人工 E-E-A-T 润色 + 实拍验证
  • Citra模拟器终极指南:如何在PC上免费畅玩任天堂3DS游戏
  • 数据质量检查:保障 AI 训练数据的可靠性
  • 2026年5月最新|上海GEO优化公司推荐:精选本地优质服务商,助力企业抢占 AI 搜索流量 - GEO排行榜
  • 在Hermes Agent框架中集成TaoToken实现自定义模型调用
  • 原神自动化助手完整指南:如何让游戏自己玩起来
  • 把Diffblue Cover集成到GitHub Actions,实现提交代码自动生成测试
  • Multilingual-E5-small API参考手册:开发者必备的完整接口文档
  • Agent Skills 万千应用 · 第11篇_AI 新闻情报 Skill:每天自动抓取你关心的 AI 动态
  • 深入MAX9295/9296内部:图解GMSL2-CSI2的4种MIPI PHY模式与数据通路设计
  • 基于树莓派与Python的智能调酒机DIY:从GPIO控制到GUI开发全解析
  • Secrets Manager Agent 升级:预取密钥 + IAM 角色切换,冷启动延迟直降 90%
  • 【MATLAB】工业安全联锁与急停逻辑仿真验证
  • 6种字重双格式:PingFangSC苹果平方字体完整技术方案
  • 基于Arduino与舵机的交互式密码保险箱制作全攻略
  • Jina-embedding-t-en-v1在信息检索中的应用:构建高效语义搜索系统
  • 如何轻松实现微信聊天记录的永久保存与智能分析
  • Citra跨平台游戏模拟:3步快速配置终极指南
  • OpCore Simplify终极指南:如何3小时快速搭建稳定黑苹果系统
  • 3种技术方案解决跨平台字体显示难题:PingFangSC字体包实战指南
  • python学习随笔
  • 15分钟告别黑苹果配置噩梦:OpCore-Simplify智能向导带你轻松搞定OpenCore EFI
  • 通达信缠论插件:3分钟让技术分析效率提升90%
  • 合肥好柿科技有限公司(好柿科技)官网、联系方式、官方网站、联系电话、联系地址、抖音账号、公司地址 - 寻茫精选
  • G-Helper终极指南:如何用轻量级工具彻底掌控你的华硕笔记本