Itertools.product为每个输入自定义组合数量?

时间:2016-10-25 23:18:54

标签: python loops itertools data-science

我正在使用itertools.product来提出一个组合。我很难解释没有例子,所以这里的代码就是这样。

group1=[1,2,3];group2=[4,5,6];group3=[7,8,9]
list(itertools.product(group1,group2,group3))

这给了我每组1的所有组合。但是,我如何获得组1中的2个数字,组2中的2个数字和组3中的1个数字的组合?

因此,例如,我希望组合(1,2,5,6,9)在列表中。可以自定义吗? itertools.product似乎并不像我需要的那样灵活,而且我在学习笛卡尔产品方面不够成功,无法理解如何调整.product函数。

编辑:我让小组变得简单,但每组都有数百个独特的值。

1 个答案:

答案 0 :(得分:2)

取每组r组合的笛卡尔积:

from itertools import product, chain, combinations, permutations

groups = [[1,2,3],[4,5,6],[7,8,9]]
counts = (2, 2, 1)

selections = [combinations(g, c) for g, c in zip(groups, counts)]

for n_tuple in product(*selections):
    print(tuple(chain.from_iterable(n_tuple)))

输出:

(1, 2, 4, 5, 7)
(1, 2, 4, 5, 8)
(1, 2, 4, 5, 9)
(1, 2, 4, 6, 7)
(1, 2, 4, 6, 8)
(1, 2, 4, 6, 9)
(1, 2, 5, 6, 7)
(1, 2, 5, 6, 8)
(1, 2, 5, 6, 9)
(1, 3, 4, 5, 7)
(1, 3, 4, 5, 8)
(1, 3, 4, 5, 9)
(1, 3, 4, 6, 7)
(1, 3, 4, 6, 8)
(1, 3, 4, 6, 9)
(1, 3, 5, 6, 7)
(1, 3, 5, 6, 8)
(1, 3, 5, 6, 9)
(2, 3, 4, 5, 7)
(2, 3, 4, 5, 8)
(2, 3, 4, 5, 9)
(2, 3, 4, 6, 7)
(2, 3, 4, 6, 8)
(2, 3, 4, 6, 9)
(2, 3, 5, 6, 7)
(2, 3, 5, 6, 8)
(2, 3, 5, 6, 9)

如果从每个组中进行选择时订单很重要,则可以将combinations更改为permutations(例如,如果(3, 2, 5, 6, 9)(2, 3, 5, 6, 9)不同)。

您应该注意,这会从choose(|g1|, c1) * choose(|g2|, c2) * ... * choose(|gN|, cN)个组生成N个元素,其中choose(n, k)binomial coefficient。如果您的团队规模如您所说的那样数百个 - 或者如果团体数量很大,那么这个数字也是无法估量的。