Python collections 模块深度应用

发布时间 - 2026-01-27 00:00:00    点击率:
defaultdict应传入可调用对象而非调用结果,如defaultdict(list)正确,defaultdict(list())错误;most_common(n)返回普通list,非Counter子集;namedtuple不可变,修改需用_replace();deque设maxlen会静默丢弃旧元素。

defaultdict 初始化时传入可调用对象,不是调用结果

很多人写 defaultdict(list) 没问题,但换成 defaultdict(list()) 就报错或行为异常——后者会立即执行 list(),返回空列表对象,导致所有键共享同一个 list 实例。

正确做法是传入类型名或 lambda:

  • defaultdict(list) —— 安全,每次缺省时调用 list()
  • defaultdict(lambda: []) —— 灵活,适合带参数的构造(如 lambda: [0] * 3
  • defaultdict(int) 等同于 defaultdict(lambda: 0),但

    更简洁

注意:传入函数必须无参,否则运行时报 TypeError: () takes 0 positional arguments but 1 was given——因为 defaultdict 内部会自动传入缺失的 key 给工厂函数(仅当工厂函数支持该签名时才生效;多数内置类型如 listint 忽略参数,但自定义函数需显式接收并忽略)。

Counter 的 most_common(n) 返回 list,不是 Counter 子集

most_common(3) 返回的是 [(key, count), ...] 形式的普通 list,不保留 Counter 类型,也不能直接继续链式调用 update()elements()

常见误用场景:

  • 想取 top-3 后再过滤:得先转回 Counter(dict(c.most_common(3)))
  • 想按频次排序但保留计数器行为:用 sorted(c.items(), key=lambda x: x[1], reverse=True)[:3] 更可控
  • c.most_common() 不传参时返回全部,性能差(O(n log n)),大数据量慎用

另外,Counter 对负数计数不做限制,但 elements() 只产出正计数项——这点常被忽略,导致遍历时“消失”了减过次数的 key。

namedtuple 是不可变对象,_replace() 才是修改入口

定义 Point = namedtuple('Point', ['x', 'y']) 后,p = Point(1, 2) 的字段不能直接赋值:p.x = 3 会触发 AttributeError

修改唯一合法方式是 _replace()

  • p._replace(x=3) 返回新实例,原 p 不变
  • 只接受关键字参数,不支持位置传参;未提供的字段保持原值
  • 字段名含下划线(如 _id)会被自动过滤,除非显式设 rename=True

注意:_replace() 不校验类型或范围,也不会触发任何钩子——它就是浅拷贝+字典更新。如果需要验证逻辑,应封装成普通 class,别硬套 namedtuple

deque 的 maxlen 参数会静默丢弃旧元素,不是警告或报错

初始化 d = deque(maxlen=3) 后,持续 append() 超过容量时,左端元素被自动踢出,不抛异常也不提示。

这在滑动窗口类场景很实用,但也容易埋坑:

  • 调试时发现数据“变少”,却没意识到是 maxlen 在起作用
  • 想检测是否发生截断?得自己维护长度对比:if len(d) == d.maxlen and len(d) > 0:
  • extend() 一次性加多个时,同样受 maxlen 约束,但行为是“整体插入后截断”,不是逐个判断

真正需要“满则报错”的场景,别用 deque,改用普通 list + 显式长度检查更清晰。


# python  # 大数据  # app  # if  # count  # 封装  # int  # Lambda  # class  # len  # append  # 对象  # 报错  # 链式  # 的是  # 左端  # 也不  # 多个  # 才是  # 很多人  # 下划线  # 但也 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Laravel如何生成URL和重定向?(路由助手函数)  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  怎样使用JSON进行数据交换_它有什么限制  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  如何在IIS7上新建站点并设置安全权限?  如何在宝塔面板中修改默认建站目录?  Laravel distinct去重查询_Laravel Eloquent去重方法  🚀拖拽式CMS建站能否实现高效与个性化并存?  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  如何挑选高效建站主机与优质域名?  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  javascript基于原型链的继承及call和apply函数用法分析  黑客如何通过漏洞一步步攻陷网站服务器?  做企业网站制作流程,企业网站制作基本流程有哪些?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  如何用狗爹虚拟主机快速搭建网站?  如何在阿里云购买域名并搭建网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  bing浏览器学术搜索入口_bing学术文献检索地址  深圳网站制作的公司有哪些,dido官方网站?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Laravel怎么清理缓存_Laravel optimize clear命令详解  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  JavaScript如何实现错误处理_try...catch如何捕获异常?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  教你用AI润色文章,让你的文字表达更专业  在centOS 7安装mysql 5.7的详细教程  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Python文件异常处理策略_健壮性说明【指导】  Python文本处理实践_日志清洗解析【指导】  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何解决hover在ie6中的兼容性问题  网站建设整体流程解析,建站其实很容易!  Laravel Fortify是什么,和Jetstream有什么关系  Python面向对象测试方法_mock解析【教程】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】