我正在使用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函数。
编辑:我让小组变得简单,但每组都有数百个独特的值。
答案 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。如果您的团队规模如您所说的那样数百个 - 或者如果团体数量很大,那么这个数字也是无法估量的。