При этом создаются все возможные комбинации путем выбора из пула 0, пула 0 и пула 1.
Однако порядок для меня это не имеет значения, поэтому многие комбинации на самом деле являются дубликатами. Например, поскольку я использовал декартово произведение, генерируются оба числа (1, 2, 4) и (2, 1, 4).
Я придумал простой способ решить эту проблему. Для участников, выбранных из одного пула, я выбираю без упорядочивания, используя комбинации_с_заменой. Я считаю, сколько раз я хочу взять деньги из каждого пула. Код выглядит следующим образом:
cnt = Counter()
for ind in part: cnt[ind] += 1
blocks = [combinations_with_replacement(pools[i], cnt[i]) for i in cnt]
return [list(chain(*combo)) for combo in product(*blocks)]
Это уменьшает количество дубликатов, если мне приходится выбирать из одного и того же пула несколько раз. Однако все пулы во многом перекрываются, и использование groups_with_replacement при объединении нескольких пулов приведет к созданию некоторых недопустимых комбинаций. Есть ли более эффективный метод создания неупорядоченных комбинаций?
Изменить: Дополнительная информация о входных данных: количество частей и пулов невелико (~ 5 и ~ 20), и для простоты каждый элемент является целым числом. Реальную проблему я уже решил, так что это просто ради академического интереса. Допустим, в каждом пуле тысячи сотен целых чисел, но некоторые пулы малы и содержат только десятки. Таким образом, кажется, что какой-то союз или пересечение — это путь.
При этом создаются все возможные комбинации путем выбора из пула 0, пула 0 и пула 1.
Однако порядок для меня это не имеет значения, поэтому многие комбинации на самом деле являются дубликатами. Например, поскольку я использовал декартово произведение, генерируются оба числа (1, 2, 4) и (2, 1, 4).
Я придумал простой способ решить эту проблему. Для участников, выбранных из одного пула, я выбираю без упорядочивания, используя комбинации_с_заменой. Я считаю, сколько раз я хочу взять деньги из каждого пула. Код выглядит следующим образом:
[code]cnt = Counter() for ind in part: cnt[ind] += 1 blocks = [combinations_with_replacement(pools[i], cnt[i]) for i in cnt] return [list(chain(*combo)) for combo in product(*blocks)] [/code]
Это уменьшает количество дубликатов, если мне приходится выбирать из одного и того же пула несколько раз. Однако все пулы во многом перекрываются, и использование groups_with_replacement при объединении нескольких пулов приведет к созданию некоторых недопустимых комбинаций. Есть ли более эффективный метод создания неупорядоченных комбинаций?
Изменить: Дополнительная информация о входных данных: количество частей и пулов невелико (~ 5 и ~ 20), и для простоты каждый элемент является целым числом. Реальную проблему я уже решил, так что это просто ради академического интереса. Допустим, в каждом пуле тысячи сотен целых чисел, но некоторые пулы малы и содержат только десятки. Таким образом, кажется, что какой-то союз или пересечение — это путь.