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



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

来自 Python 文档

itertools.product(*iterables[, repeat])

输入可迭代对象的笛卡尔积。

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

换句话说:

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)。

最新更新