Я нашел способ перечислить все возможные комбинации из n элементов, сгруппированных в наборы из k элементов. По математике, число легко: n! / (K! * (N-k)!), А код Python действительно прост с использованием itertools:
>>> import itertools
>>> a = [1,2,3,4]
>>> list(itertools.combinations(a,3))
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
Но как реализовать ограничение типа: перечислять только группы, содержащие только m общих элементов? поэтому в предыдущем примере для m = 1 результат должен быть:
[(1, 2, 3)]
С 5 элементами и m = 1:
>>> b=[1,2,3,4,5]
>>> list(itertools.combinations(b,3))
[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]
Итак, мой результат:
[(1, 2, 3), (1, 4, 5)]
Практическое применение этого вопроса - как сгруппировать людей, учитывая, что только m человек могут повторяться в группах результатов. Идея состоит в том, чтобы найти группы с разными людьми, чтобы избежать групп «друзей». Представьте себе школьное мероприятие, которое повторяется несколько дней, и мы хотим, чтобы люди как можно больше не повторяли друг друга.