2016-10-25 8 views
0

Я использую itertools.product, чтобы придумать комбинацию групп. Я плохо объясняю без примеров, так что вот код как есть.Itertools.product для настройки количества комбо для каждого входа?

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

Это дает мне все комбинации по 1 из каждой группы. Но как мне получить комбинацию из 2-х чисел из 1-й, 2-й цифры из группы 2 и 1 номер из 3-й группы?

Так, например, я хотел бы, чтобы комбинация (1,2,5,6,9) была в списке. Можно ли это настроить? itertools.product не кажется таким гибким, как мне это нужно, и я не увенчался успехом в обучении картезианских продуктов, чтобы понять, как настроить функцию .product.

EDIT: Я сделал группы небольшими, чтобы они были простыми, но каждая группа будет иметь сотни уникальных значений.

+0

Вам нужен продукт '[1, 2]', '[5, 6]' и '[9]' или комбинации '[1, 2, 5, 6, 9]' –

+2

Если group1, group2 , а у группы 3 есть 200 элементов, вы смотрите на что-то вроде 79202000000 различных возможностей, что слишком много, чтобы перебирать, даже несмотря на то, что мы не реализуем их. Вы уверены, что задаете вопрос, который вам действительно нужен? – DSM

ответ

2

Возьмите декартово произведение г-комбинаций каждой группы:

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. Это невероятно большое, если размеры вашей группы находятся в сотнях, как вы говорите, или если количество групп велико.

 Смежные вопросы

  • Нет связанных вопросов^_^