写Python时你是不是也有这烦恼?明明只是想组合两个列表,却硬生生写出三层嵌套循环,再加上一堆if判断和append操作,代码又长又乱,写完自己都不想看第二遍。
其实不是你水平不行,只是没用到Python标准库里的“隐藏神器”——itertools模块。这东西看着不起眼,却能把复杂的循环逻辑一键简化,今天就把它的9个实用技巧掰开揉碎了讲,全是能直接上手的干货。
1. 笛卡尔积:多层循环一键合并
想生成颜色和尺寸的所有组合,你是不是还在写两层for循环?
python
colors = ['red', 'green', 'blue']
sizes = ['S', 'M', 'L']
for color in colors:
for size in sizes:
print(color, size)
用 itertools.product() ,一行就能搞定,加再多维度也不怕:
python
import itertools
for c, s in itertools.product(colors, sizes):
print(c, s)
不管是2层还是5层循环,它都能一次性合并,逻辑清晰到离谱。
生成两位字母密码组合,不用写嵌套循环,给 product 加个 repeat 参数就行:
python
for p in itertools.product('ABCD', repeat=2):
print(''.join(p))
输出结果和两层循环完全一样,但代码简洁度直接拉满,新手也能一眼看懂。
3. 排列组合:数学需求直接落地
数学里的排列组合不用自己写算法, permutations 和 combinations 直接帮你实现。
- 排列:讲究顺序,元素不重复,比如从ABC里选2个排列:
python
for p in itertools.permutations('ABC', 2):
print(p)
- 组合:不讲究顺序,比如从ABC里选2个组合:
python
for c in itertools.combinations('ABC', 2):
print(c)
省去手写判断逻辑的麻烦,效率直接翻倍。
需要无限循环输出0、1、2?不用写取余运算, cycle 函数一键实现:
python
for i in itertools.cycle([0, 1, 2]):
print(i)
注意:这是真·无限循环,运行时记得手动停止。
想从指定数字开始递增计数? count 函数就是你的“自动计数器”:
python
for i in itertools.count(10):
print(i)
if i > 15:
break
生成日志编号、处理数据流时,这两个函数能省不少事。
5. 迭代器切片:精准截取不用索引
处理大型数据时,不想一次性加载全部内容? islice 帮你精准控制截取范围。
- 只取前3个元素:
python
data = [1,2,3,4,5,6]
for i in itertools.islice(data, 3):
print(i)
- 跳过前2个,取后面所有元素:
python
for i in itertools.islice(data, 2, None):
print(i)
不用手动写索引判断,还能节省内存,处理日志、API返回数据时超好用。
按条件给数据分组,不用写一堆循环和判断, groupby 函数直接搞定:
python
data = [('A',1),('A',2),('B',3),('B',4)]
for key, group in itertools.groupby(data, lambda x: x[0]):
print(key, list(group))
划重点: groupby 只对连续相同的key分组,数据没排序的话,记得先 sorted 一下。
7. 迭代器合并:多个列表无缝衔接
有多个列表想当成一个整体遍历?不用手动拼接, chain 函数直接帮你串联:
python
for x in itertools.chain([1,2], [3,4], [5]):
print(x)
就像把几条小路连成一条大道,遍历逻辑瞬间变丝滑。
8. 数据过滤:开关列表直观筛选
想按条件筛选数据?不用写for+if, compress 用“开关列表”来筛选,逻辑更直观:
python
data = ['a','b','c','d']
selectors = [1,0,1,0] # 1保留,0丢弃
for i in itertools.compress(data, selectors):
print(i)
比列表推导式更适合需要直观控制筛选条件的场景。
9. 实战场景:测试参数组合自动生成
写自动化测试脚本时,需要生成多组参数组合? product 函数直接帮你搞定:
python
colors = ['red','green']
sizes = ['S','M']
styles = ['casual','formal']
for c,s,st in itertools.product(colors, sizes, styles):
print(f"测试用例:{c}-{s}-{st}")
不管参数有多少维度,都能一键生成所有组合,测试效率直接翻倍。
其实itertools不只是一个工具,更是一种Pythonic的编程思维——用最少的代码,做最多的事。告别繁琐的嵌套循环,你的代码会变得更优雅、更易维护。
你平时写Python时,最头疼的循环场景是什么?有没有用过itertools的其他隐藏技巧?评论区聊聊,咱们一起把代码写得更简洁。
我可以帮你生成这篇文章的1:1配套配图,画面会包含Python代码界面和itertools核心函数图标,需要吗?
转载请注明来自海坡下载,本文标题:《嵌套循环优化(9个itertools神用法告别Python嵌套循环)》
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...