Generar todas las permutaciones posibles de los subconjuntos que contienen todo el elemento de un conjunto

Sea S (w) un conjunto de palabras. Quiero generar todas las combinaciones n posibles de subconjuntos s para que la unión de esos subconjuntos sea siempre igual a S (w).

Así que tienes un conjunto (a, b, c, d, e) y no serás todas las combinaciones de 3:

((a B C D e))

((a B C D e))

((a B C D e))

((a B C D e))

etc …

Para cada combinación tienes 3 juegos y la unión de esos juegos es el juego original. No hay conjunto vacío, no falta elemento.

Debe haber una manera de hacerlo usando itertools.combination + collection.Counter pero no puedo ni siquiera comenzar en alguna parte … ¿Puede alguien ayudar?

Lucas

EDITAR: Necesitaría capturar todas las combinaciones posibles, incluyendo:

((a, e), (b, d) (c))

etc …

¿algo como esto?

 from itertools import combinations, permutations t = ('a', 'b', 'c', 'd', 'e') slicer = [x for x in combinations(range(1, len(t)), 2)] result = [(x[0:i], x[i:j], x[j:]) for i, j in slicer for x in permutations(t, len(t))] 

Solución general, para cualquier n y cualquier longitud de tupla:

 from itertools import combinations, permutations t = ("a", "b", "c") n = 2 slicer = [x for x in combinations(range(1, len(t)), n - 1)] slicer = [(0,) + x + (len(t),) for x in slicer] perm = list(permutations(t, len(t))) result = [tuple(p[s[i]:s[i + 1]] for i in range(len(s) - 1)) for s in slicer for p in perm] [ (('a',), ('b', 'c')), (('a',), ('c', 'b')), (('b',), ('a', 'c')), (('b',), ('c', 'a')), (('c',), ('a', 'b')), (('c',), ('b', 'a')), (('a', 'b'), ('c',)), (('a', 'c'), ('b',)), (('b', 'a'), ('c',)), (('b', 'c'), ('a',)), (('c', 'a'), ('b',)), (('c', 'b'), ('a',)) ]