当前位置: 首页 > 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.jsqmd.com/news/905206/

相关文章:

  • 猫抓插件完整指南:三步轻松掌控网页视频音频资源
  • DeepSeek多模态输出格式兼容方案(含OpenAI/Anthropic双协议映射表·限时公开)
  • 紧急预警:Claude v3.5部署后出现的3类静默降级现象,架构评审组已在27家头部客户中确认复现
  • 百度网盘macOS版SVIP功能破解完整指南:告别限速下载
  • 猫抓浏览器扩展:你的网页视频下载神器,三分钟告别在线观看限制
  • 终极指南:如何快速微调gbert-large-openmind适应你的德语领域特定任务 [特殊字符]
  • MATLAB音频处理应用开发:从参数均衡器到实时频谱分析
  • DiffusionNet实战:用PyTorch复现三维网格分类与分割(附完整代码与数据集)
  • ⑥ AI写作接单实战:公众号-小红书-知乎多平台内容变现
  • 终极指南:如何让百度网盘下载速度提升10倍?这个开源工具告诉你答案
  • 从零到一:OpCore-Simplify如何让黑苹果配置变得如此简单
  • 开发者必看:Qwen2-7B的SFT与RLHF后训练最佳实践
  • 微信聊天记录永久保存指南:如何用WeChatMsg打造你的数字记忆库
  • 雀魂牌谱屋完整指南:三分钟搭建个人麻将数据分析中心
  • Zotero终极指南:如何通过自定义排序规则打造高效的文献管理系统
  • 导师推荐!2026年实力出众的专业AI智能降重工具 - 降AI小能手
  • 树莓派Pico入门:MicroPython控制LED闪烁原理与实践
  • 如何通过Python快速调用Taotoken平台上的多款大模型
  • FlexNet许可证服务器架构:单机与高可用对比
  • Arduino交通灯项目:从电路搭建到程序实现的嵌入式入门指南
  • 如何永久保存微信聊天记录:开源工具WeChatMsg数据备份与深度分析完整指南
  • ncmdump完全指南:专业解密网易云音乐NCM加密格式
  • Citra模拟器终极指南:如何在PC上免费畅玩任天堂3DS游戏
  • Arduino单引脚驱动双LED:电流源与电流汇电路设计实战
  • Sora 2多模态协同工作流:文本→动态分镜→音效波形→字幕动效,1套打通AIGC短视频工业化链路
  • 从timedatectl到chrony:Linux时间同步服务选型与进阶配置指南(Ubuntu/CentOS实测)
  • 在徐州,旧黄金首饰去哪卖划算?多家门店详细对比+真实场景指南(支持上门回收) - 寻茫精选
  • AI 内容安全写法:AIGC 初稿 + 人工 E-E-A-T 润色 + 实拍验证
  • Arduino智能秒表实战:TM1637显示与蜂鸣器报警系统设计
  • 如何永久保存微信聊天记录:开源工具让数据真正属于你