Aquí es una solución utilizando la recursividad, combs_r
tiene accum
digerir head
(la siguiente lista en línea) para producir un gordo accum0
, y luego se llama a sí mismo ("recursividad") con tail
(las listas restantes) y el ahora más gordo acumula accum0
.
Puede ser un gran usuario de la memoria ya que cada llamada a combs_r
agrega un nuevo espacio de nombres, hasta el final cuando todo se desenrolla. Una persona más perceptible en Python interna podría comentar sobre esto.
Paga para aprender prólogo, en mi humilde opinión.
def combs(ll):
if len(ll) == 0:
return []
if len(ll) == 1:
return [[item] for item in ll[0]]
elif len(ll) == 2:
return lmul(ll[0], [[item] for item in ll[1]])
else:
return combs_r(ll[1:], ll[0])
def combs_r(ll, accum):
head = ll[0]
tail = ll[1:]
accum0 = []
accum0 = lmul(head, accum)
if len(tail) == 0:
return accum0
else:
return combs_r(tail, accum0)
def lmul(head, accum):
accum0 = []
for ah in head:
for cc in accum:
#cc will be reused for each ah, so make a clone to mutate
cc0 = [x for x in cc]
cc0.append(ah)
accum0.append(cc0)
return accum0
sampleip = [['a','b','c'],[1,2], ['A', 'B']]
sampleip2 = [['a','b','c'],[1,2]]
sampleip1 = [['a','b','c']]
sampleip0 = []
print combs(sampleip0)
print combs(sampleip1)
print combs(sampleip2)
print combs(sampleip)
Para cualquier persona que se pregunta, el * frente a un desempaqueta la lista: http://stackoverflow.com/a/2921893/4549682 – wordsforthewise