Python collections 实战:defaultdict、Counter、deque 解决三类高频痛点
Python collections 实战:defaultdict、Counter、deque 解决三类高频痛点你写 Python 处理数据时,大概率反复写过这三段代码:判断 key 在不在字典里再初始化、手动累加计数、用list.pop(0)从头部删元素。它们能跑,但要么啰嗦要么慢。标准库collections里有三个容器专治这三种痛点。这篇用真实场景对比「朴素写法」和「正确写法」,让你以后条件反射就用对。痛点一:分组时反复判断 key 存在——用 defaultdict把一批订单按用户分组,朴素写法:orders[(alice,100),(bob,50),(alice,30),(bob,20),(alice,10),]grouped{}foruser,amountinorders:ifusernotingrouped:# 每次都要判断初始化grouped[user][]grouped[user].append(amount)# {alice: [100, 30, 10], bob: [50, 20]}那句if user not in grouped出现在每一个分组循环里,重复又容易忘。defaultdict让「key 不存在时自动初始化」变成默认行为:fromcollectionsimportdefaultdict groupeddefaultdict(list)# 访问不存在的 key 时,自动 list()foruser,amountinorders:grouped[user].append(amount)# 直接 append,不用判断defaultdict(list)里的list是一个工厂函数:每当访问一个不存在的 key,它就调用list()生成空列表作为默认值。换成int就能做累加计数:countsdefaultdict(int)# 默认值 0foruser,_inorders:counts[user]1# 不存在时先当 0 再 1# {alice: 3, bob: 2}一个坑:defaultdict的「自动创建」发生在读取时。d[k]只要访问就会创建 key,哪怕你只是想检查:ddefaultdict(list)ifd[missing]:# 这一句就凭空创建了 d[missing] []passprint(dict(d))# {missing: []} ← 意外多了一个 key想检查而不创建,用k in d或d.get(k),别用d[k]。痛点二:计数与找 Top N——用 Counter统计词频,朴素写法要么手动defaultdict(int),要么更原始。Counter一步到位:fromcollectionsimportCounter wordsapple banana apple cherry banana apple.split()cCounter(words)# Counter({apple: 3, banana: 2, cherry: 1})它的杀手锏是most_common(n),直接按出现次数排序拿 Top N,省掉手写sorted(..., key...):c.most_common(2)# [(apple, 3), (banana, 2)]Counter还支持算术运算,做「两批数据的差异」特别顺手:beforeCounter(a3,b1,c2)afterCounter(a5,b1,d1)after-before# Counter({a: 2, d: 1}) 只保留正数增量afterbefore# 合并累加(afterbefore)# 交集取较小值:Counter({a: 3, b: 1})注意-运算会丢弃结果为 0 或负数的项(c从 2 变 0 直接消失)。想保留负数用c.subtract():dCounter(a1)d.subtract(Counter(a3))# d 变成 Counter({a: -2}),负数保留痛点三:从头部频繁增删——用 deque实现一个「最近 N 条」的滑动窗口,或者 BFS 队列,朴素写法用 list:queue[]queue.append(x)# 尾部加,O(1),没问题queue.pop(0)# 头部删,O(n)!每次都要把后面所有元素前移list.pop(0)是O(n)的——列表底层是连续数组,删头部要把后面全部元素往前挪一格。数据一大,性能就崩。deque(双端队列)两头增删都是O(1):fromcollectionsimportdeque queuedeque()queue.append(1)# 右侧入队 O(1)queue.append(2)queue.popleft()# 左侧出队 O(1),取代 list.pop(0)# → 1deque最实用的一个特性是maxlen,自动实现定长滑动窗口:满了之后,一端进、另一端自动挤出去:recentdeque(maxlen3)# 只保留最近 3 条foriinrange(5):recent.append(i)# deque([2, 3, 4], maxlen3) ← 0 和 1 被自动挤掉了用它做「最近访问记录」「移动平均窗口」再合适不过,完全不用手动判断长度再删头。一个性能直觉对比(10 万次头部出队):importtimefromcollectionsimportdeque N100_000lstlist(range(N))ttime.perf_counter()whilelst:lst.pop(0)# O(n) 每次print(list:,time.perf_counter()-t)# 秒级dqdeque(range(N))ttime.perf_counter()whiledq:dq.popleft()# O(1) 每次print(deque:,time.perf_counter()-t)# 毫秒级差距是数量级的。小结defaultdict(factory):分组、累加时告别if key not in d;但注意d[k]读取即创建,检查用in或.get()。Counter:计数一步到位,most_common(n)拿 Top N,还能用 - 做集合算术求差异(-会丢弃非正数项)。deque:两端增删 O(1),取代慢成 O(n) 的list.pop(0);maxlen自动做定长滑动窗口。一句话记忆点:分组用 defaultdict、计数用 Counter、队列用 deque——看到pop(0)就该警觉换 deque。

相关新闻

终极指南:如何在电脑上免费畅玩Switch游戏的完整教程

终极指南:如何在电脑上免费畅玩Switch游戏的完整教程

终极指南:如何在电脑上免费畅玩Switch游戏的完整教程 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 你是否曾梦想在电脑上体验任天堂Switch的精彩游戏世界?yuzu模拟器正是实现这一梦想的完…

2026/8/3 15:58:19 阅读更多 →
Go 程序在 K8s 里 CPU 被打满:GOMAXPROCS 没感知容器 limits 与 automaxprocs 修复

Go 程序在 K8s 里 CPU 被打满:GOMAXPROCS 没感知容器 limits 与 automaxprocs 修复

Go 程序在 K8s 里 CPU 被打满:GOMAXPROCS 没感知容器 limits 与 automaxprocs 修复 你的 Go 服务在物理机上跑得好好的,一上 Kubernetes,同样的负载 CPU 却莫名被限流(throttling),P99 延迟飙高,GC 也变频繁。查了半天代码没问题,问题出在一个你从没设过的运行时参数:GOMAXPROC…

2026/8/3 15:58:19 阅读更多 →
3分钟完成视频字幕提取:开源工具的极简使用指南

3分钟完成视频字幕提取:开源工具的极简使用指南

3分钟完成视频字幕提取:开源工具的极简使用指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内容提取。…

2026/8/3 15:58:18 阅读更多 →

最新新闻

智能游戏助手:如何用开源自动化工具彻底解放你的鸣潮游戏时间

智能游戏助手:如何用开源自动化工具彻底解放你的鸣潮游戏时间

智能游戏助手:如何用开源自动化工具彻底解放你的鸣潮游戏时间 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 还在为《…

2026/8/4 0:58:02 阅读更多 →
Agent到底需要什么样的记忆?上交清华横评12套记忆方案

Agent到底需要什么样的记忆?上交清华横评12套记忆方案

一句话讲清楚👉🏻 上交、清华和 MemTensor 的这项研究把 Agent 记忆拆成表示存储、抽取、检索路由和维护四个数据管理模块,并用 12 套代表系统的统一实验说明:长期记忆的瓶颈已经从“能不能存”转向“能不能在更新、检索、成本之间…

2026/8/4 0:56:02 阅读更多 →
NomNom开源工具:5分钟掌握《无人深空》终极定制神器

NomNom开源工具:5分钟掌握《无人深空》终极定制神器

NomNom开源工具:5分钟掌握《无人深空》终极定制神器 【免费下载链接】nomnom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item indivi…

2026/8/4 0:56:02 阅读更多 →
终极免费Office激活指南:如何用Ohook解锁Microsoft 365完整功能

终极免费Office激活指南:如何用Ohook解锁Microsoft 365完整功能

终极免费Office激活指南:如何用Ohook解锁Microsoft 365完整功能 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/…

2026/8/4 0:56:02 阅读更多 →
5分钟解锁跨语言超能力:Translumo实时屏幕翻译工具完全指南

5分钟解锁跨语言超能力:Translumo实时屏幕翻译工具完全指南

5分钟解锁跨语言超能力:Translumo实时屏幕翻译工具完全指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 还…

2026/8/4 0:56:02 阅读更多 →
ExifToolGui终极指南:如何快速批量重命名照片文件并智能管理元数据

ExifToolGui终极指南:如何快速批量重命名照片文件并智能管理元数据

ExifToolGui终极指南:如何快速批量重命名照片文件并智能管理元数据 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui ExifToolGui是一款强大的Windows图形界面工具,它基于著名的ExifTo…

2026/8/4 0:55:02 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →