Python模块:内置模块itertools迭代工具全解析
Python模块内置模块itertools迭代工具全解析一、开篇迭代器的瑞士军刀itertools是Python标准库中的高性能迭代工具箱——所有函数都用C实现比手写的Python循环快得多。它提供了构建高效迭代管道的积木块无限序列、组合生成、分组过滤、累积计算。⌨️ 三大类工具importitertools# 1. 无限迭代器count, cycle, repeat# 2. 有限迭代器accumulate, chain, compress, groupby 等# 3. 组合迭代器product, permutations, combinations二、无限迭代器importitertools# count(start, step) —— 无限计数counteritertools.count(10,2)# 从10开始每次2print([next(counter)for_inrange(5)])# [10, 12, 14, 16, 18]# cycle(iterable) —— 无限循环cycleritertools.cycle([A,B,C])print([next(cycler)for_inrange(7)])# [A, B, C, A, B, C, A]# repeat(obj, times) —— 重复timesNone表示无限repeateritertools.repeat(Hello,3)print(list(repeater))# [Hello, Hello, Hello]# ⚠️ 无限迭代器会一直生成元素需要手动控制停止# 通常搭配 islice 或 break 使用三、有限迭代器3.1 拼接和展平importitertools# chain(*iterables) —— 拼接多个迭代器resultlist(itertools.chain([1,2],[3,4],[5,6]))print(result)# [1, 2, 3, 4, 5, 6]# chain.from_iterable —— 展平嵌套结构nested[[1,2],[3,4],[5,6]]flatlist(itertools.chain.from_iterable(nested))print(flat)# [1, 2, 3, 4, 5, 6]# 展平更深的结构自定义函数defflatten(nested_list):递归展平任意深度的嵌套列表foriteminnested_list:ifisinstance(item,list):yieldfromflatten(item)else:yielditem deep[1,[2,[3,4],5],6]print(list(flatten(deep)))# [1, 2, 3, 4, 5, 6]3.2 切片和过滤importitertools# islice(iterable, stop) —— 切片支持start, stop, stepnumbersrange(100)print(list(itertools.islice(numbers,5)))# [0, 1, 2, 3, 4]print(list(itertools.islice(numbers,10,15)))# [10, 11, 12, 13, 14]print(list(itertools.islice(numbers,0,20,5)))# [0, 5, 10, 15]# dropwhile(predicate, iterable) —— 跳过开头的满足条件的元素data[1,3,5,2,4,6,1,3]print(list(itertools.dropwhile(lambdax:x5,data)))# [5, 2, 4, 6, 1, 3]# takewhile(predicate, iterable) —— 取开头的满足条件的元素print(list(itertools.takewhile(lambdax:x5,data)))# [1, 3]# filterfalse(predicate, iterable) —— 保留假值filter的反向print(list(itertools.filterfalse(lambdax:x%20,range(10))))# [1, 3, 5, 7, 9]# compress(data, selectors) —— 按布尔掩码过滤data[A,B,C,D,E]mask[True,False,True,False,True]print(list(itertools.compress(data,mask)))# [A, C, E]3.3 累加和分组importitertools# accumulate(iterable, func) —— 累积计算numbers[1,2,3,4,5]print(list(itertools.accumulate(numbers)))# [1, 3, 6, 10, 15] 累加print(list(itertools.accumulate(numbers,max)))# [1, 2, 3, 4, 5] 到当前位置的最大值print(list(itertools.accumulate(numbers,lambdaa,b:a*b)))# [1, 2, 6, 24, 120] 累乘# groupby(iterable, key) —— 按key分组需要先排序data[(技术部,张三),(技术部,李四),(市场部,王五),(市场部,赵六),]# keylambda x: x[0] 等于按部门分组fordept,membersinitertools.groupby(data,keylambdax:x[0]):names[m[1]forminmembers]print(f{dept}:{, .join(names)})# 技术部: 张三, 李四# 市场部: 王五, 赵六# ⚠️ groupby只能合并相邻的相同key——如果数据未排序先排序# pairwise(iterable) —— 相邻元素配对Python 3.10print(list(itertools.pairwise([1,2,3,4,5])))# [(1,2), (2,3), (3,4), (4,5)]四、组合迭代器importitertools items[A,B,C]# product(*iterables, repeat) —— 笛卡尔积print(list(itertools.product(items,repeat2)))# [(A,A), (A,B), (A,C), (B,A), (B,B), (B,C), (C,A), (C,B), (C,C)]# permutations(iterable, r) —— 排列顺序重要print(list(itertools.permutations(items,2)))# [(A,B), (A,C), (B,A), (B,C), (C,A), (C,B)]# combinations(iterable, r) —— 组合顺序不重要print(list(itertools.combinations(items,2)))# [(A,B), (A,C), (B,C)]# combinations_with_replacement —— 有放回组合print(list(itertools.combinations_with_replacement(items,2)))# [(A,A), (A,B), (A,C), (B,B), (B,C), (C,C)]# 实战生成骰子所有可能的组合dicerange(1,7)# 1-6all_outcomeslist(itertools.product(dice,repeat2))print(f两个骰子有{len(all_outcomes)}种结果)五、实战案例importitertools# 案例生成测试数据的笛卡尔积defgenerate_test_cases():生成测试用例矩阵browsers[Chrome,Firefox,Safari]os_list[Windows,Mac,Linux]resolutions[1920x1080,1366x768]forbrowser,os_name,resinitertools.product(browsers,os_list,resolutions):yield{browser:browser,os:os_name,resolution:res}print(f共{sum(1for_ingenerate_test_cases())}个测试用例)# 案例滑动窗口defsliding_window(iterable,n):创建滑动窗口iteratorsitertools.tee(iterable,n)fori,itinenumerate(iterators):for_inrange(i):next(it,None)returnzip(*iterators)data[1,2,3,4,5,6,7,8]forwindowinsliding_window(data,3):print(window)# (1, 2, 3) (2, 3, 4) (3, 4, 5) ...六、总结itertools是构建高效数据处理管道的工具箱。用C实现的迭代器比手写Python循环快得多。核心函数速查无限序列count,cycle,repeat拼接展平chain,chain.from_iterable切片过滤islice,takewhile,dropwhile,compress,filterfalse累积分组accumulate,groupby组合生成product,permutations,combinations✅这些函数是函数式编程风格的基石——链式调用、惰性求值、组合使用构建高效的数据处理管道。

相关新闻

SQL AI助手开发

SQL AI助手开发

1. 项目说明本项目以 MySQL 8.0 DBA 运维核心知识点为基础,结合硅基流动开源大模型 API,构建一套电商订单库智 能查询与性能调优系统。系统可接收业务自然语言自动生成合规 MySQL 查询语句,自动执行查询并输出结构化表格,依托大模…

2026/10/11 4:06:52 阅读更多 →
C#三大Timer深度解析:从UI更新到后台任务的正确选择

C#三大Timer深度解析:从UI更新到后台任务的正确选择

1. 项目概述:为什么C#开发者需要了解不同的Timer?在C#开发中,无论是桌面应用、后台服务还是Web应用,定时任务都是一个绕不开的话题。你可能需要定时刷新UI、轮询数据库、发送心跳包或者执行周期性的数据清理。乍一看,S…

2026/10/3 11:47:36 阅读更多 →
Elasticsearch内存配置实战:堆内堆外分配、性能调优与避坑指南

Elasticsearch内存配置实战:堆内堆外分配、性能调优与避坑指南

1. 项目概述:为什么Elasticsearch内存设置是性能的命门搞搜索和日志分析的朋友,对Elasticsearch(后面简称ES)肯定不陌生。这东西用起来爽,但调优起来,尤其是内存这块,绝对是新手和老手的分水岭。…

2026/10/17 9:14:45 阅读更多 →

最新新闻

Unity项目接入APNs远程推送:证书配置、deviceToken获取与原生交互全流程

Unity项目接入APNs远程推送:证书配置、deviceToken获取与原生交互全流程

1. APNs远程推送接入前的关键认知:先搞懂一整条链路如果你的Unity项目要在iOS上接入远程推送,第一反应大概率是:这不就是申请个推送证书,后端调个接口,手机弹个通知吗?等真的动手才发现,Unity这…

2026/10/18 0:49:30 阅读更多 →
提高LCD屏幕刷新效率:基于TaoToken的ST7789驱动配置与LCD_Fill优化实践

提高LCD屏幕刷新效率:基于TaoToken的ST7789驱动配置与LCD_Fill优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:49:30 阅读更多 →
从零部署OpenClaw到阿里云ECS:打造云端AI助手的实践指南

从零部署OpenClaw到阿里云ECS:打造云端AI助手的实践指南

简介:基于阿里云ECS的OpenClaw一键部署方案,是一份面向无运维经验技术爱好者与开发者的实操指南,旨在帮助用户借助一台低配云服务器,在十五分钟内完成个性化AI助手的云端搭建与管理。整份指南以单个PDF文档呈现,压缩包…

2026/10/18 0:49:30 阅读更多 →
公钥密码学与伪随机数:密钥生成中的随机源与熵池管理

公钥密码学与伪随机数:密钥生成中的随机源与熵池管理

1. 从一个看似矛盾的问题说起公钥密码学里有一个特别反直觉的事实:你用来加密的密钥是公开的,任何人都能拿到,但别人依然解不开你的密文。这件事第一次接触会觉得像魔术,但支撑它的数学基础其实相当朴素——单向函数。正向计算容易…

2026/10/18 0:48:30 阅读更多 →
信息安全意识PPT设计:从知道到做到的行为转化工具包

信息安全意识PPT设计:从知道到做到的行为转化工具包

简介:本资源是一份面向全民网络安全素养提升的国家网络安全宣传周主题PPT课件,适用于企事业单位安全培训、高校通识教育及社区科普宣讲等场景。内容紧扣信息泄露风险防范与网络安全意识培养,系统梳理了网络安全四大核心特征(机密性…

2026/10/18 0:48:30 阅读更多 →
Hy3-oQ2模型卡深度解读:什么是oQ校准量化,2.7 bits/weight意味着什么

Hy3-oQ2模型卡深度解读:什么是oQ校准量化,2.7 bits/weight意味着什么

【免费下载链接】Hy3-oQ2 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Hy3-oQ2 点击查看 免费下载 Hy3-oQ2 是腾讯混元 Hy3(295B MoE)大模型的 MLX oQ 校准量化版本:以 2.7 bits/weight 的有效精度,把…

2026/10/18 0:48:30 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →