Bueno, el problema que quería resolver era más complicado, porque además quería generarlos de uno en uno sin guardar los resultados parciales, cosa que ya he hecho, pero como es una restricción que no había contemplado y el código queda un poco más complicado he decidido hacer también la versión normal, es decir, almacenando resultados parciales hasta que se devuelven todos.
def lattice(l):
s = [[]]
for e in l:
ns = []
for ps in s:
nps = ps[:]
nps.append(e)
ns.append(nps)
s = s + ns
return s
PD:
do-while en las combnaciones no importa el orden, importa en las variaciones.
ghastlyX sí, también lo puedes ver como la unión de las particiones de un conjunto.
PD2: no se me había ocurrido hacerlo recursivo, no queda del todo mal:
def lattice(l):
if l == []:
return [[]]
ll = lattice(l[1:])
return [e+[l[0]] for e in ll] + ll