Python itertools 常用迭代组合技巧
技术百科
舞姬之光
发布时间:2026-01-27
浏览: 次 itertools.chain 是合并多个可迭代对象的最优解,惰性求值、内存友好;chain.from_iterable 适用于嵌套结构;groupby 需预排序才能正确分组;islice 是安全截取迭代器的唯一方式。
用 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.product 和 itertools.combinations_with_replacement 别混淆使用场景
这两个都生成组合,但语义完全不同,选错会导致逻辑错误或爆炸式增长。
-
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');适合模拟抽样放回且不计顺序 - 容易踩坑:
permutations和combinations默认不放回;若要放回且有序,只能用product(比如密码暴力枚举:每个位置从字符集里独立选)
真正难的不是记住函数名,而是每次调用前确认:这个迭代器是否已耗尽?键是否已排序?切片范围是否超出生成能力?这些状态不会报错,只会静默返回空结果。
# ai
# 就会
# 几个
# 多个
# 有一
# 当你
# python
# 跳过
# 迭代
# go
# 循环
# 对象
# 堆
# 报错
# 切片
# len
# for
# count
# Lambda
# 可迭代对象
# 笛卡尔
# 放回
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么设置任务栏图标大小_Windows1
- c++中如何使用auto关键字_c++11类型推导
- Linux怎么实现内网穿透_Linux安装Frp客
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- c++怎么调用nana库开发GUI_c++ 现代风
- Windows家庭版如何开启组策略(gpedit.
- Win11开始菜单打不开_修复Windows 11
- Golang如何测试HTTP中间件_Golang
- php串口通信波特率怎么选_根据硬件手册设置正确波
- Win11怎么设置应用分屏_Windows11贴靠
- Win11怎么开启远程桌面连接_Windows11
- 如何使用Golang处理网络超时错误_Golang
- 如何使用Golang指针与接口结合_实现方法调用和
- 如何将竖排文本文件转换为横排字符串
- Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺
- 如何使用Golang安装API文档生成工具_快速生
- c++ std::future和std::prom
- Mac电脑进水了怎么办_MacBook进水后紧急处
- Windows任务计划服务异常原因_任务调度失败的
- WindowsUSB驱动安装异常怎么办_USB驱动
- Windows10如何更改任务栏高度_Win10解
- 零基础学会Python自动化办公_高效处理Exce
- Win11怎么关闭定位服务_保护Win11位置隐私
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Python面向对象实战讲解_类与设计模式深入理解
- MAC怎么一键隐藏桌面所有图标_MAC极简模式切换
- 如何使用Golang处理静态文件缓存_提高页面加载
- Windows10系统怎么查看显卡型号_Win10
- 如何在Golang中实现自定义Benchmark_
- php8.4如何配置ssl证书_php8.4htt
- 如何在Golang中指定模块版本_使用go.mod
- php增删改查需要哪些扩展_开启mysqli或pd
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Windows11怎么自定义任务栏_Windows
- PHP主流架构如何处理会话管理_Session与C
- Win11怎么设置任务栏透明_Windows11使
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- php删除数据怎么软删除_添加is_del字段标记
- Win11怎么开启远程桌面_Win11系统远程桌面
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- Win11怎么查看显卡温度 Win11任务管理器查
- 如何在包含多值的列中精准搜索指定演员?
- Win11怎么开启窗口对齐助手_Windows11
- Win11摄像头无法使用怎么办_Win11相机隐私
- windows系统如何安装cab更新补丁_wind
- 如何理解Go指针和内存分配关系_Go Pointe
- 怎么将XML数据可视化 D3.js加载XML
- 网站内页做seo排名怎么做?
- Windows10如何查看保存的WiFi密码_Wi


QQ客服