news 2026/8/1 12:24:04

Python模块:内置模块collections数据结构扩展

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python模块:内置模块collections数据结构扩展

Python模块:内置模块collections数据结构扩展

一、开篇:标准容器的升级版

Python内置的listdicttupleset已经很强大,但有时你需要更专业的工具。collections模块提供了这些"高级容器"——namedtuple让元组有名字,deque让两端操作飞起来,Counter让统计一行搞定,defaultdict让字典不再抛KeyError。

⌨️ 导入:

fromcollectionsimport(namedtuple,deque,Counter,defaultdict,OrderedDict,ChainMap)

二、namedtuple:有名字的元组

fromcollectionsimportnamedtuple# 创建具名元组类型:类名 + 字段名(空格分隔或列表)Point=namedtuple("Point",["x","y"])Student=namedtuple("Student","name age score")# 创建实例p=Point(3,4)s=Student("张三",20,92)# 像元组一样索引,像对象一样用属性名print(p[0],p[1])# 3 4 —— 元组用法print(p.x,p.y)# 3 4 —— 对象用法,更可读!print(f"{s.name}:{s.age}岁,{s.score}分")# 实用方法print(s._asdict())# {'name': '张三', 'age': 20, 'score': 92} 转字典print(s._replace(age=21))# Student(name='张三', age=21, score=92) 替换字段# 从字典创建data={"name":"李四","age":25,"score":88}s2=Student(**data)# 💡 namedtuple不可变,节省内存,是tuple的直接子类print(isinstance(s,tuple))# True# 应用:表示数据库查询结果defquery_users():User=namedtuple("User","id name email")return[User(1,"张三","zs@test.com"),User(2,"李四","ls@test.com")]foruserinquery_users():print(f"ID:{user.id}{user.name}<{user.email}>")

三、deque:双端队列

fromcollectionsimportdeque# 创建双端队列dq=deque([1,2,3])print(dq)# deque([1, 2, 3])# append/appendleft —— 两端添加 O(1)!dq.append(4)# 右端添加dq.appendleft(0)# 左端添加print(dq)# deque([0, 1, 2, 3, 4])# pop/popleft —— 两端弹出 O(1)!print(dq.pop())# 4(右端弹出)print(dq.popleft())# 0(左端弹出)# maxlen —— 限制最大长度(FIFO自动丢弃旧元素)history=deque(maxlen=3)# 只保留最近3条foriinrange(5):history.append(i)print(f"添加{i}后:{list(history)}")# 添加0后: [0]# 添加1后: [0, 1]# 添加2后: [0, 1, 2]# 添加3后: [1, 2, 3] ← 0被丢弃# 添加4后: [2, 3, 4] ← 1被丢弃# rotate(n) —— 旋转元素dq=deque([1,2,3,4,5])dq.rotate(2)# 右旋2位:后面2个移到前面print(dq)# deque([4, 5, 1, 2, 3])dq.rotate(-1)# 左旋1位print(dq)# deque([5, 1, 2, 3, 4])# 💡 deque vs list:# list的pop(0)/insert(0,v)是O(n),deque的popleft()/appendleft(v)是O(1)# 适合实现队列、栈、滑动窗口

四、Counter:频次计数器

fromcollectionsimportCounter# 统计可迭代对象中各元素的出现次数words="mississippi"cnt=Counter(words)print(cnt)# Counter({'i': 4, 's': 4, 'p': 2, 'm': 1})# 最常用的方法print(cnt.most_common(3))# [('i', 4), ('s', 4), ('p', 2)]print(cnt["i"])# 4 —— 访问计数print(cnt["z"])# 0 —— 不存在的键返回0,不抛KeyError!# 更新计数cnt.update("mississippi")# 累加print(cnt["i"])# 8cnt.subtract("miss")# 累减print(cnt["i"])# 7# Counter支持算术运算a=Counter("abc")b=Counter("bcd")print(a+b)# Counter({'b': 2, 'c': 2, 'a': 1, 'd': 1})print(a-b)# Counter({'a': 1}) —— 差集(计数相减,只保留正的)print(a&b)# Counter({'b': 1, 'c': 1}) —— 交集(取最小值)print(a|b)# Counter({'a': 1, 'b': 1, 'c': 1, 'd': 1}) —— 并集(取最大值)# 实际应用:词频统计text="the cat and the dog and the mouse"word_counts=Counter(text.split())print(word_counts.most_common(3))# [('the', 3), ('and', 2), ('cat', 1)]

五、defaultdict:带默认值的字典

fromcollectionsimportdefaultdict# 普通字典访问不存在的键会抛出KeyErrord={}# d["key"] += 1 # KeyError!# defaultdict在访问不存在的键时,自动用default_factory创建默认值dd=defaultdict(int)# int()返回0print(dd["count"])# 0 —— 自动创建!dd["count"]+=1print(dd["count"])# 1# 常用的default_factorydd_list=defaultdict(list)# 默认空列表 → 方便分组dd_set=defaultdict(set)# 默认空集合 → 方便去重分组dd_dict=defaultdict(dict)# 默认空字典dd_str=defaultdict(str)# 默认空字符串dd_counter=defaultdict(lambda:0)# 自定义默认值# 经典应用:分组students=[("技术部","张三"),("市场部","李四"),("技术部","王五"),("市场部","赵六"),("人事部","钱七"),]by_dept=defaultdict(list)fordept,nameinstudents:by_dept[dept].append(name)fordept,membersinby_dept.items():print(f"{dept}:{', '.join(members)}")# 技术部: 张三, 王五# 市场部: 李四, 赵六# 人事部: 钱七# ⚠️ defaultdict的坑dd=defaultdict(list)dd["key"].append(1)# 正常# "key" in dd 是True(因为访问过,已被创建)# 如果你只想读取而不想创建,用普通dict的get()方法

六、OrderedDict和ChainMap

fromcollectionsimportOrderedDict,ChainMap# OrderedDict —— 保持插入顺序# Python 3.7+普通dict也保持顺序,但OrderedDict有额外方法od=OrderedDict()od["a"]=1od["b"]=2od["c"]=3print(od)# OrderedDict([('a', 1), ('b', 2), ('c', 3)])od.move_to_end("a")# 移到末尾print(od)# OrderedDict([('b', 2), ('c', 3), ('a', 1)])# ChainMap —— 合并多个字典(按顺序查找)defaults={"host":"localhost","port":8080,"debug":False}user_config={"port":9090,"debug":True}runtime_config={"host":"192.168.1.1"}config=ChainMap(runtime_config,user_config,defaults)print(config["host"])# 192.168.1.1 —— 从runtime_config找到print(config["port"])# 9090 —— 从user_config找到print(config["debug"])# True —— 从user_config找到# 查找顺序:runtime_config → user_config → defaults

七、总结

collections模块为Python的标准容器提供了专业级升级。选择正确的容器能让代码更简洁、更高效。

💡选型速查:

  • 元组需要字段名 →namedtuple
  • 两端高效操作 →deque
  • 统计频次 →Counter
  • 避免KeyError →defaultdict
  • 合并多字典 →ChainMap
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 12:22:24

SpringBoot校园招聘系统开发实战与技术解析

1. 项目概述&#xff1a;校园线上招聘系统的核心价值大学生就业一直是社会关注的热点问题。传统线下招聘会受时间、空间限制&#xff0c;企业招聘成本高&#xff0c;学生获取信息渠道有限。基于SpringBoot的校园线上招聘系统正是为解决这一痛点而生。这个系统本质上是一个B2B2C…

作者头像 李华
网站建设 2026/8/1 12:22:12

中国信通院泰尔实验室全景图发布,悬镜安全位列软件供应链安全与AI原生安全第一梯队

近日&#xff0c;中国信通院泰尔实验室发布第五期《数字安全护航技术能力全景图》。作为数字安全领域的重要产业观察与能力评估成果&#xff0c;该全景图围绕关键技术方向、代表企业能力与落地成熟度进行梳理&#xff0c;为行业理解数字安全技术演进提供了参考。在本期全景图中…

作者头像 李华
网站建设 2026/8/1 12:19:44

网盘下载加速终极指南:如何用免费工具突破限速瓶颈

网盘下载加速终极指南&#xff1a;如何用免费工具突破限速瓶颈 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 网盘直链下载助手是一款免费开源的浏览器扩展脚本&#xff0c;专门用于获取百度…

作者头像 李华
网站建设 2026/8/1 12:16:01

MCU学习笔记系列

MCU学习笔记系列 1. ADCDMA 目标数组无更新 解决办法 (个人博客链接) (CSDN链接)2. ARM Cortex-M内核中DMA内存地址对齐的影响与效率权衡 (个人博客链接) (CSDN链接)3. ARM原子操作 (个人博客链接) (CSDN链接)4. ART-PI在KEIL的使用教程(个人笔记) (个人博客链接) (CSDN链接)5.…

作者头像 李华
网站建设 2026/8/1 12:14:04

chat chatting chatted 鸡匹体

chat chatting chatted 鸡匹体AI P1US 直冲官方正规渠道&#xff0c;非账号代充&#xff0c;安全稳定 不是共享&#xff01;不是中转&#xff01;是给你自己的号充值&#xff01; 支持首次开通、续订/续费&#xff0c;操作简单&#xff0c;附详细教程&#xff0c;小白也能搞定&…

作者头像 李华
网站建设 2026/8/1 12:13:28

MAVLink 2.0协议深度解析:从帧格式到STM32嵌入式移植实战

1. 项目概述&#xff1a;从MAVLink 1.0到2.0的演进之路 如果你正在捣鼓无人机、机器人或者任何需要飞控与地面站、多个子系统之间通信的项目&#xff0c;那么MAVLink协议绝对是你绕不开的一个核心组件。它不是什么高深莫测的黑科技&#xff0c;而是一套非常接地气、专为资源受限…

作者头像 李华