【发布时间】:2014-01-20 00:51:37
【问题描述】:
在编写一个查找列表的所有不同组合的程序时,我发现了很多关于使用intertools.product() 而不是intertools.combinations_with_replacement() 的线程,就像我一直在做的那样。没有人解释为什么你应该使用 intertools.product。我很想知道这对我的程序输出有何影响。
【问题讨论】:
标签: python python-3.x python-3.3
在编写一个查找列表的所有不同组合的程序时,我发现了很多关于使用intertools.product() 而不是intertools.combinations_with_replacement() 的线程,就像我一直在做的那样。没有人解释为什么你应该使用 intertools.product。我很想知道这对我的程序输出有何影响。
【问题讨论】:
标签: python python-3.x python-3.3
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 - 从第二个等。
【讨论】:
combinations_with_replacement 的比较,这是明确的问题。
这段代码可以帮助你理解。
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,这一直持续到迭代结束。
【讨论】: