0

0

Python itertools 常用迭代组合技巧

舞姬之光

舞姬之光

发布时间:2026-01-27 19:42:47

|

371人浏览过

|

来源于php中文网

原创

itertools.chain 是合并多个可迭代对象的最优解,惰性求值、内存友好;chain.from_iterable 适用于嵌套结构;groupby 需预排序才能正确分组;islice 是安全截取迭代器的唯一方式。

python itertools 常用迭代组合技巧

itertools.chain 合并多个可迭代对象,别再写 for 循环拼接

当你要把几个列表、生成器或文件行流串成一个连续流时,itertools.chain 是最轻量也最符合 Python 语义的解法。它不立即展开数据,保持惰性求值,内存友好。

  • 常见错误:用 + 拼接列表(触发复制,且只支持 list)或手动 for 循环 extend(破坏迭代器本质)
  • 正确写法:chain(list_a, list_b, range(3), my_generator()),返回一个迭代器,可直接用于 for 或传给 list()
  • 注意 chain.from_iterable 的适用场景:当你有一堆嵌套的可迭代对象(如 [[1,2], [3,4], (5,)]),它比 chain(*nested) 更安全(避免解包空序列报错)

itertools.groupby 必须先排序,否则分组结果不符合直觉

groupby 不是“按值归类”,而是“对连续相同键的元素分段”。如果输入没排好序,同一键的元素被分散,就会被拆成多组。

  • 典型翻车现场:对未排序的 ['a', 'b', 'a', 'c']groupby(x),得到三组:('a', ['a'])('b', ['b'])('a', ['a']) —— 第二个 'a' 不会和第一个合并
  • 正确做法:先用 sorted(data, key=key_func),再传给 groupby;若原始顺序不能丢,可考虑用 defaultdict(list) 替代
  • key 函数返回值必须可哈希;若需按对象属性分组,确保该属性稳定且可哈希(比如 lambda x: x.category

itertools.islice 安全截取大迭代器,避开 list[10:20] 的陷阱

对生成器、文件对象或无限迭代器(如 count())做切片时,不能用方括号语法——那会触发 __getitem__,而多数迭代器不支持。必须用 islice

  • islice(iterator, start, stop, step) 返回新迭代器,不消耗原迭代器前面的项(除非 start > 0,此时会跳过前 start 项)
  • 注意:不能反向切片(stop 无效),也不能负索引;需要倒序取最后 N 项?得先转成 deque(maxlen=N)
  • 常见误用:islice(my_gen(), 1000000, 1000010) 会跳过前一百万项——如果只是想取前 10 项,直接写 islice(gen, 10) 即可,别加多余参数

itertools.productitertools.combinations_with_replacement 别混淆使用场景

这两个都生成组合,但语义完全不同,选错会导致逻辑错误或爆炸式增长。

一键职达
一键职达

AI全自动批量代投简历软件,自动浏览招聘网站从海量职位中用AI匹配职位并完成投递的全自动操作,真正实现'一键职达'的便捷体验。

下载

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

  • product(A, B) 是笛卡尔积:所有 (a,b) 对,长度为 len(A) * len(B);常用于参数网格搜索、路径枚举
  • combinations_with_replacement(iterable, r) 是“可重复选 r 个的无序组合”:比如 combinations_with_replacement('AB', 2)('A','A'), ('A','B'), ('B','B');适合模拟抽样放回且不计顺序
  • 容易踩坑:permutationscombinations 默认不放回;若要放回且有序,只能用 product(比如密码暴力枚举:每个位置从字符集里独立选)

真正难的不是记住函数名,而是每次调用前确认:这个迭代器是否已耗尽?键是否已排序?切片范围是否超出生成能力?这些状态不会报错,只会静默返回空结果。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

207

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

53

2026.01.05

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

395

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号