Python中itertools.product:快速生成笛卡尔积

01 itertools.product函数基础介绍

itertools.product是Python标准库itertools中的一个高阶函数,用于生成输入可迭代对象的笛卡尔积。简单来说,它会返回所有可能的组合,就像数学中的笛卡尔积运算一样。

核心函数语法

复制代码
itertools.product(*iterables, repeat=1)

参数说明

  • iterables:一个或多个可迭代对象(如列表、元组、字符串等)。

    repeat:可选参数,表示重复生成笛卡尔积的次数(默认值为 1)。

注意:当输入的可迭代对象元素较多或repeat值较大时,笛卡尔积的数量会呈指数级增长,可能导致内存不足。

返回值:一个生成器对象,按字典序生成所有可能的组合。

基础案例:生成两个列表的笛卡尔积

复制代码
import itertools
# 定义两个列表
colors = ['red', 'blue']
sizes = ['S', 'M', 'L']
# 生成笛卡尔积
product = itertools.product(colors, sizes)
# 转换为列表查看结果
print(list(product))

输出结果

复制代码
[('red', 'S'), ('red', 'M'), ('red', 'L'), 
 ('blue', 'S'), ('blue', 'M'), ('blue', 'L')]

说明:itertools.product将colors和sizes的每个元素依次组合,生成了6种可能的组合,这正是数学中两个集合的笛卡尔积结果。

02 常用功能与进阶案例

1. 使用repeat参数生成重复组合

当需要生成同一个可迭代对象的多次笛卡尔积时,repeat参数非常有用。

案例:生成两位数的所有可能组合(00-99)

复制代码
import itertools
# 生成0-9的数字列表
digits = list(range(10))
# 生成两位数的所有组合(相当于product(digits, digits))
two_digits = itertools.product(digits, repeat=2)
# 转换为列表并查看前5个结果
print(list(two_digits)[:5])

输出结果

复制代码
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4)]

说明:repeat=2相当于将digits作为两个参数传入product,生成所有可能的两位数组合,共10×10=100种。

2. 与字符串结合生成字符组合

itertools.product可以轻松生成字符的所有可能组合,这在密码生成、验证码生成等场景中非常实用。

案例:生成4位数字验证码的所有可能组合

复制代码
import itertools
# 数字字符列表
digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# 生成4位数字的所有组合
verification_codes = itertools.product(digits, repeat=4)
# 转换为字符串并查看前3个结果
print([f''.join(code) for code in verification_codes][:3])

输出结果

复制代码
['0000', '0001', '0002']

3.简化for循环

我们是不是经常会看到以下的for循环处理:

复制代码
user = ['user', 'admin', 'guest']
code = list(range(1, 11))


for i in user:
for j in code:
print(i,j)

使用itertools.product改写为如下,看上去更简单,效果也一样。

复制代码
import itertools

user = ['user', 'admin', 'guest']
code = list(range(1, 11))

for i,j in itertools.product(user, code):
print(i,j)

4. 密码破解模拟

生成可能的密码组合(仅用于安全测试)。

案例:生成简单密码的所有可能组合

复制代码
import itertools
# 密码字符集
chars = 'abcdefghijklmnopqrstuvwxyz0123456789@¥#~!%^&*'
passwords = itertools.product(chars, repeat=4)
# 查看密码数量
print(len(list(passwords)))
#输出为4100625
相关推荐
JarmanYuo几秒前
YOLO 涨点研究(六):网络结构改进之小目标增强篇1——无人机视角下的车辆与行人检测
人工智能·pytorch·python·yolo·计算机视觉·无人机
2601_962297255 分钟前
python自带缓存lru_cache用法及扩展的使用_python
python·缓存·装饰器·lru_cache·my_cache
招财小梗10 分钟前
沈阳AI企业咨询可定制数字化方案吗?
大数据·人工智能·python
磐链科技13 分钟前
区块链开发入门实战:用 Hardhat 与 Ethers.js 搭建你的第一个 DApp
开发语言·javascript·区块链
csdn2015_17 分钟前
java springboot项目,接收到的参数多个逗号
java·开发语言·spring boot
leihefeng26 分钟前
邮件文本分类:CountVectorizer / TF-IDF + 朴素贝叶斯
python·分类·数据挖掘·tf-idf·sklearn
码艺-Alimjan27 分钟前
维吾尔语数字转文本
java·javascript·python·算法·go
可乐鸡翅yeah_27 分钟前
hls.js 多实例并发踩坑,多视频页面播放器内存与冲突问题解决
开发语言·前端·javascript·音视频·hls·m3u8·m3u8在线播放
俊昭喜喜里29 分钟前
c#中的构造函数
开发语言·数据库·c#
hahaha601640 分钟前
HLS高层次综合设计--axi之burst纠偏
开发语言·算法·fpga开发·c#