This is my attempt : def cross(seq): r=[[]] for x in seq: r = [ a + b for a in r for b in [[i] for i in x ]] return r
It is not very efficient though as it would loop through the intermediate list produced multiple times. [EMAIL PROTECTED] wrote: > Hello, > > i think it could be done by using itertools functions even if i can not > see the trick. i would like to have all available "n-uples" from each > list of lists. > example for a list of 3 lists, but i should also be able to handle any > numbers of items (any len(lol)) > > lol = (['a0', 'a1', 'a2'], ['b0', 'b1'], ['c0', 'c1', 'c2', 'c3']) > > => > > > [('a0', 'b0', 'c0'), ('a0', 'b0', 'c1'), ('a0', 'b0', 'c2'), ('a0', > 'b0', 'c3'), ('a0', 'b1', 'c0'), ('a0', 'b1', 'c1'), ('a0', 'b1', > 'c2'), ('a0', 'b1', 'c3'), ('a1', 'b0', 'c0'), ('a1', 'b0', 'c1'), > ('a1', 'b0', 'c2'), ('a1', 'b0', 'c3'), ('a1', 'b1', 'c0'), ('a1', > 'b1', 'c1'), ('a1', 'b1', 'c2'), ('a1', 'b1', 'c3'), ('a2', 'b0', > 'c0'), ('a2', 'b0', 'c1'), ('a2', 'b0', 'c2'), ('a2', 'b0', 'c3'), > ('a2', 'b1', 'c0'), ('a2', 'b1', 'c1'), ('a2', 'b1', 'c2'), ('a2', > 'b1', 'c3')] > > maybe tee(lol, len(lol)) can help ? > > it could be done by a recursive call, but i am interested in using and > understanding generators. > > i also have found a convenient function, here : > http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65285 (paste > below) > but i am curious of how you will do it or refactorize this one with > generators... > > def permuteflat(*args): > outs = [] > olen = 1 > tlen = len(args) > for seq in args: > olen = olen * len(seq) > for i in range(olen): > outs.append([None] * tlen) > plq = olen > for i in range(len(args)): > seq = args[i] > plq = plq / len(seq) > for j in range(olen): > si = (j / plq) % len(seq) > outs[j][i] = seq[si] > for i in range(olen): > outs[i] = tuple(outs[i]) > return outs > > many thanx -- http://mail.python.org/mailman/listinfo/python-list