在生成所有可能的组合时,itertools.combinations_with_replacement()vs itertools.product()?

时间:2014-01-20 00:51:38

标签: python python-3.x python-3.3

在编写一个找到列表所有不同组合的程序时,我发现很多关于使用intertools.product()代替intertools.combinations_with_replacement()的线程,正如我一直在做的那样。没有人解释为什么你应该使用intertools.product。我很想知道这会如何影响我的程序输出。

2 个答案:

答案 0 :(得分:3)

From Python documentation

  

itertools.product(* iterables [,repeat])

     

输入迭代的笛卡尔积。

     

等效于生成器表达式中的嵌套for循环。例如,   对于B中的y,product(A,B)返回与(x,y)中的x相同的返回值。

换句话说:

for x, y in itertools.product(A, B):

替换

for x in A:
    for y in B:
............

修改

  • itertolls.combinations_with_replacement()将采用单次迭代并生成给定长度的元素的所有可能组合;

  • itertools.product()将生成来自多个迭代的值的组合,其中生成的元组的元素0来自 第一个可迭代,第一个元素 - 来自第二个,等等。

答案 1 :(得分:0)

这段代码将帮助您理解。

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一直持续到可迭代结束。