itertools.product是python标准库中专用于生成笛卡尔积的高效工具,返回内存友好的迭代器,支持多列表、重复自身及有序元组输出。

用 itertools.product 做笛卡尔积最直接
Python 标准库的 itertools.product 就是专为这个设计的,不用手写嵌套循环,也不用额外装包。它返回一个迭代器,内存友好,尤其适合大列表。
基本用法:list(itertools.product(list_a, list_b)) 得到元组列表;如果只要可迭代对象(比如后续要逐个处理),直接用 itertools.product(list_a, list_b) 更省内存。
- 参数顺序决定结果中元组元素顺序:
product(A, B)生成的是(a, b),不是(b, a) - 支持多个列表:如
product(A, B, C)会生成长度为 3 的元组 - 若需重复自身(如 A × A),用
repeat=2参数:product(A, repeat=2)
itertools.product 和手动双重循环的区别在哪
表面上结果一样,但行为差异影响实际使用:
- 返回类型不同:手动循环通常生成 list,而
product默认返回迭代器——不调用list()就不会展开全部结果,这对千万级组合很关键 - 空列表处理不同:若任一输入为空,
product直接返回空迭代器(len(list(product([], [1,2]))) == 0),而手写 for 循环容易漏判边界,导致意外跳过或报错 - 无法直接解包成变量名:比如不能写
for x, y in product(A, B)后再用x和y—— 实际可以,但前提是每个元组长度固定且匹配;如果传入三个列表却只写两个变量,会触发ValueError: too many values to unpack
常见报错和踩坑点
多数问题出在数据类型或参数误用,而不是函数本身逻辑错误:
-
TypeError: 'int' object is not iterable:传了数字而非可迭代对象,比如写成product(3, [1,2]),正确应为product([3], [1,2])或product(range(3), [1,2]) - 结果看起来“少了一层”:默认输出是
(a, b)这样的元组,不是[[a,b]]或[a,b]。需要列表形式就套list(),需要扁平化结构(如[a,b,c,d])就得额外用itertools.chain.from_iterable或列表推导式 - 中文字符或自定义对象参与运算时,只要它们能被正常遍历,就没问题;但要注意对象是否可哈希——这不影响
product,只影响后续能否塞进 set 或 dict
性能和兼容性提醒
itertools.product 是 C 实现的,比纯 Python 双重循环快不少,CPython 3.6+ 表现稳定。但在 PyPy 下优势缩小,因为其 JIT 对简单循环优化很好。
真正要注意的是组合爆炸:两个长度为 1000 的列表会产生 100 万个元组。即使只是创建迭代器,一旦调用 list() 或 len(),就会全量计算并吃光内存。
如果只是想取前 N 个结果,用 itertools.islice(product(A, B), N);如果要过滤条件后再取,别先转 list 再 filter,而是边迭代边判断。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











