说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
itertools.product() 是 Python itertools 模块中的一个函数,用于生成多个可迭代对象的笛卡尔积。这意味着它可以生成所有可能的组合,其中每个组合由各个可迭代对象的元素组成。itertools.product() 接受多个可迭代对象,并生成一个迭代器,其中包含这些可迭代对象的所有元素组合。这对于生成排列和组合非常有用。
此方法的语法为itertools.product(*iterables, repeat=1)
,用于可迭代对象输入的笛卡儿积。大致相当于生成器表达式中的嵌套循环。例如, product(A, B) 和 ((x,y) for x in A for y in B) 返回结果一样。
参数与返回值:
*iterables
:一个或多个可迭代对象,如列表、元组、字符串等。注意事项:
嵌套循环像里程表那样循环变动,每次迭代时将最右侧的元素向后迭代。这种模式形成了一种字典序,因此如果输入的可迭代对象是已排序的,笛卡尔积元组依次序发出。
要计算可迭代对象自身的笛卡尔积,将可选参数 repeat 设定为要重复的次数。例如,product(A, repeat=4) 和 product(A, A, A, A) 是一样的。
该函数大致相当于下面的代码,只不过实际实现方案不会在内存中创建中间结果。
def product(*args, repeat=1):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = [tuple(pool) for pool in args] * repeat
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
在 product() 运行之前,它会完全耗尽输入的可迭代对象,在内存中保留值的临时池以生成结果积。 相应地,它只适用于有限的输入。
例如:
import itertools
t = itertools.product('abcd','xy')
[*t]
'''
[('a', 'x'),
('a', 'y'),
('b', 'x'),
('b', 'y'),
('c', 'x'),
('c', 'y'),
('d', 'x'),
('d', 'y')]
'''
t2 = itertools.product('a','xy', repeat=2)
[*t2]
'''
[('a', 'x', 'a', 'x'),
('a', 'x', 'a', 'y'),
('a', 'y', 'a', 'x'),
('a', 'y', 'a', 'y')]
'''
import itertools
list1 = [1, 2]
list2 = ['a', 'b']
# 使用 product 生成 list1 和 list2 的笛卡尔积
result = itertools.product(list1, list2)
print(list(result)) # 输出 [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
import itertools
list1 = [1, 2]
# 使用 product 生成 list1 的重复笛卡尔积
result = itertools.product(list1, repeat=2)
print(list(result)) # 输出 [(1, 1), (1, 2), (2, 1), (2, 2)]
假设我们有两个列表,一个包含不同的颜色,另一个包含不同的尺寸。我们希望生成所有颜色和尺寸的组合。
示例数据:
colors = ['red', 'green']
sizes = ['S', 'M', 'L']
目标生成所有颜色和尺寸的组合:
[('red', 'S'), ('red', 'M'), ('red', 'L'), ('green', 'S'), ('green', 'M'), ('green', 'L')]
实现代码:
import itertools
colors = ['red', 'green']
sizes = ['S', 'M', 'L']
# 使用 itertools.product 生成颜色和尺寸的组合
result = itertools.product(colors, sizes)
print(list(result))
# 输出 [('red', 'S'), ('red', 'M'), ('red', 'L'), ('green', 'S'), ('green', 'M'), ('green', 'L')]
解释:
输出结果:
[('red', 'S'), ('red', 'M'), ('red', 'L'), ('green', 'S'), ('green', 'M'), ('green', 'L')]
这个实用案例展示了如何使用 itertools.product() 生成多个可迭代对象的笛卡尔积,非常适用于生成排列、组合和多维数据处理的场景。
更新时间:July 4, 2024, 8:39 a.m. 标签:python itertools 笛卡儿积