У меня есть список элементов, из которых я хотел бы определить все возможные комбинации, которые можно упорядочить - сохраняя их порядок - чтобы получить 'n' групп
Так, например, если яЕсли у вас есть упорядоченный список A, B, C, D, E и требуется только две группы, четыре решения будут такими:
ABCD, E
ABC, DE
AB, CDE
A, BCDE
Теперь, с некоторой помощью из другого сообщения StackOverflow Я придумал работоспособное решение для перебора, которое вычисляет все возможные комбинации всех возможных группировок, из которых я просто извлекаю те случаи, которые соответствуют моему целевому числу группировок.
Для разумного количества элементов этоэто нормально, но по мере того, как я увеличиваю количество элементов, количество комбинаций увеличивается очень очень быстро, и мне стало интересно, может ли быть разумный способ ограничить решения, рассчитанные только теми, которые соответствуют числу целевых групп?
Код пока выглядит следующим образом:
import itertools
import string
import collections
def generate_combination(source, comb):
res = []
for x, action in zip(source,comb + (0,)):
res.append(x)
if action == 0:
yield "".join(res)
res = []
#Create a list of first 20 letters of the alphabet
seq = list(string.ascii_uppercase[0:20])
seq
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H ',' I ',' J ',' K ',' L ',' M ',' N ',«O», «P», «Q», «R», «S», «T»]
#Generate all possible combinations
combinations = [list(generate_combination(seq,c)) for c in itertools.product((0,1), repeat=len(seq)-1)]
len(combinations)
524288
#Create a list that counts the number of groups in each solution,
#and counter to allow easy query
group_counts = [len(i) for i in combinations]
count_dic = collections.Counter(group_counts)
count_dic[1], count_dic[2], count_dic[3], count_dic[4], count_dic[5], count_dic[6]
(1, 19, 171,969, 3876, 11628)
Итак, как вы можете видеть, в то время как более полумиллиона комбинаций были рассчитаны, если бы я только хотел иметь комбинации длиной = 5, вычислилось только 3876
Есть предложения?