在编写一个查找列表中所有不同组合的程序时,我发现了很多关于使用
intertools.product()
而不是 intertools.combinations_with_replacement()
的线程,就像我一直在做的那样。没有人解释为什么您应该使用 intertools.product。我很想知道这如何影响我的程序输出。
itertools.product(*iterables[,重复])
输入可迭代对象的笛卡尔积。
相当于生成器表达式中的嵌套 for 循环。例如, Product(A, B) 返回与 ((x,y) for x in A for y in B) 相同的结果。
换句话说:
for x, y in itertools.product(A, B):
替换
for x in A:
for y in B:
............
编辑:
itertolls.combinations_with_replacement() 将采用单个可迭代对象并生成给定长度的其元素的所有可能组合;
itertools.product() 将生成多个可迭代值的组合,其中结果元组的元素 0 来自 第一个可迭代,元素 1 - 从第二个开始,等等。
这段代码将帮助您理解。
from itertools import combinations_with_replacement
from itertools import product
string = input()
for ele in list(combinations_with_replacement(string,2)):
print("".join(ele), end=' ')
print()
prod = list(product(string,repeat = 2))
for ele in prod:
print("".join(ele), end=' ')
输入
ABCD
输出
AA AB AC AD BB BC BD CC CD DD
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
编辑:
如您所见,combinations_with_replacement() 的输出生成从第一个到最后一个元素的每种可能的组合,即“AA AB AC AD”,然后它会生成剩余元素与第二个到最后一个的每种可能的组合,即“ BB BC BD' 请注意,它不会从第二个元素返回到第一个元素。 在 Product() 的情况下,生成的输出是从第一个元素到第二个元素以及从第二个元素到第一个元素,即 AB 和 BA,这一直持续到迭代结束。
如果其他人像我一样被这个问题绊倒: 在 itertools 文档中有一个示例,您可以清楚地看到 4 个组合迭代器的结果之间的差异。
product('ABCD', repeat=2)
AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
所有值都组合在一起,甚至与其自身 (AA)。
permutations('ABCD', 2)
AB AC AD BA BC BD CA CB CD DA DB DC
仅将与迭代值不匹配的值组合在一起(AB)。
combinations('ABCD', 2)
AB AC AD BC BD CD
仅将与迭代值不匹配的值组合在一起,但按排序顺序不存在重复项(AB / BA)。
combinations_with_replacement('ABCD', 2)
AA AB AC AD BB BC BD CC CD DD
所有值都组合在一起,甚至与其自身 (AA) 组合在一起,但按排序顺序没有重复项 (AB / BA)。