讲师中心 微信公众号
AI工具推荐 视频效率加速

Python collections 模块的进阶用法

大伟同学_5379

大伟同学_5379

发布时间:2026-02-11 17:34:02

|

326人浏览过

|

来源于php中文网

原创

defaultdict工厂函数须为可调用对象,如list而非[];Counter手动改value会导致most_common()结果滞后;namedtuple字段名须合法标识符;deque模拟队列须用popleft()而非pop()。

python collections 模块的进阶用法

defaultdict 初始化值写错类型,程序不报错但逻辑崩了

用 defaultdict 时传错工厂函数,比如该用 list 却写了 [],或者该用 int 却写了 0,代码能跑,但每次访问新键都返回同一个可变对象,后续修改会互相污染。

  • defaultdict([]) 是错的——[] 不是可调用对象,会直接抛 TypeError: first argument must be callable
  • 正确写法是 defaultdict(list)(无括号),因为 list 是类型,可调用;defaultdict(lambda: []) 也行,但没必要
  • 常见陷阱:用 defaultdict({}) 想默认字典,结果报错;得写 defaultdict(dict)
  • 如果工厂函数有参数(比如想默认空字符串 ''),不能直接写 defaultdict(''),得用 defaultdict(str) 或 defaultdict(lambda: '')

Counter 统计后直接改 value,下次 most_common() 就不准了

Counter 是 dict 子类,但它的 most_common() 结果依赖内部状态,手动改某个 key 的 value 不会自动触发重排序或缓存刷新,导致统计视图滞后。

  • 不要写 c['a'] = 100 后还指望 c.most_common(1) 立刻返回 ('a', 100)——它可能仍按旧顺序排
  • 安全做法是:改完后显式调用 c.clear() 再重建,或用 Counter(c) 重新封装一次
  • 更轻量的替代:需要动态更新+查 topN,优先考虑用 heapq.nlargest(n, c.items(), key=lambda x: x[1]),绕过 most_common 缓存
  • 注意 Counter 对负数计数合法(比如 c.subtract(['x'])),但 most_common() 默认只返回正数项,负值和零值被忽略

namedtuple 定义后字段名含空格或数字开头,import 就失败

namedtuple 生成的是类,字段名最终变成属性名,必须符合 Python 标识符规则。名字不合规不会在定义时报错,而是在首次实例化或访问字段时才崩。

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载
  • 错误示例:Point = namedtuple('Point', ['x pos', '2nd']) → 实例化后访问 p.x pos 语法错误,p.2nd 直接 SyntaxError
  • 解决方法:用 rename=True 参数自动修复,比如 namedtuple('Point', ['x pos', '2nd'], rename=True) 会转成 _0, _1,但可读性差
  • 更稳妥的做法:预处理字段名,用 re.sub(r'[^a-zA-Z0-9_]', '_', name).strip('_') 清洗,再确保不以数字开头
  • 注意:字段名重复也会触发 rename=True,比如 ['a', 'b', 'a'] → 第二个 a 变成 _2,容易漏看

deque 做队列用 pop() 而不是 popleft(),结果变成栈了

deque 默认从右端操作,pop() 和 append() 都在尾部,如果不小心用 pop() 替代 popleft() 来模拟 FIFO,实际就退化成 LIFO,语义全反。

立即学习“Python免费学习笔记(深入)”;

  • 典型场景:BFS 遍历图时误写 queue.pop(),导致深度优先行为,路径变长甚至死循环
  • 性能差异明显:popleft() 是 O(1),pop() 也是 O(1),但语义错位比性能问题更致命
  • 调试技巧:打印前几轮出队元素顺序,对照预期 BFS 层序,立刻能发现是不是“先进后出”
  • 如果真要兼顾双端,明确命名变量,比如 stack = deque() / queue = deque(),靠名字约束使用习惯
事情说清了就结束。collections 里这几个类型看着简单,但工厂函数、字段校验、操作端点这些细节,一不留神就埋在运行时里,等数据不对了才回头翻文档。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

15680

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1163

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

8670

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

3442

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2844

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5949

2023.11.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn