¿Cómo encontrar todos los grupos de subconjuntos del conjunto A? Establecer particiones en Python
Quiero encontrar un algoritmo que proporcione un conjuntoA
para encontrar todos los grupos de subconjuntos que satisfacen la siguiente condición:
x ∪ y ∪ .... z = A, donde x, y, ... z ∈ Grupo
y
∀ x, y ∈ Grupo: x ⊆ A, y ⊆ A, x ∩ y = ∅ = {}
y
∀ x ∈ Grupo: x! = ∅
Nota: espero definirlo bien, no soy bueno con los símbolos matemáticos
Hice el siguiente enfoque para buscar grupos de dos subconjuntos solamente:
from itertools import product, combinations
def my_combos(A):
subsets = []
for i in xrange(1, len(A)):
subsets.append(list(combinations(A,i)))
combos = []
for i in xrange(1, 1+len(subsets)/2):
combos.extend(list(product(subsets[i-1], subsets[-i])))
if not len(A) % 2:
combos.extend(list(combinations(subsets[len(A)/2-1], 2)))
return [combo for combo in combos if not set(combo[0]) & set(combo[1])]
my_combos({1,2,3,4})
Obtengo el siguiente resultado, todos estos grupos están compuestos por dos subconjuntos
[
((1,), (2, 3, 4)),
((2,), (1, 3, 4)),
((3,), (1, 2, 4)),
((4,), (1, 2, 3)),
((1, 2), (3, 4)),
((1, 3), (2, 4)),
((1, 4), (2, 3))
]
..... pero, grupos compuestos por uno, tres, cuatro subconjuntos ...
Pregunta:
¿Cómo puedo encontrar una solución general?
por ejemplo el siguiente resultado esperado:
my_combos({1,2,3,4})
[
((1,2,3,4)),
((1,2,3),(4,)),
((1,2,4),(3,)),
((1,3,4),(2,)),
((2,3,4),(1,)),
((1,2),(3,4)),
((1,3),(2,4)),
((1,4),(2,3)),
((1,2),(3,),(4,)),
((1,3),(2,),(4,)),
((1,4),(2,),(3,)),
((1,),(2,),(3,4)),
((1,),(3,),(2,4)),
((1,),(4,),(2,3)),
((1,),(4,),(2,),(3,))
]