(newbie) N-uples from list of lists
bonono at gmail.com
bonono at gmail.com
Wed Nov 23 22:08:13 EST 2005
Out of curiousity, is "recursion" the desirable way(or is it pythonic
way) ? How would one do it in the imperative way ?
Dan Bishop wrote:
> > it could be done by a recursive call, but i am interested in using and
> > understanding generators.
>
> def cross(*args):
> """Iterates over the set cross product of args."""
> if not args:
> return
> elif len(args) == 1:
> for x in args[0]:
> yield (x,)
> else:
> for x in args[0]:
> for y in cross(*args[1:]):
> yield (x,) + y
>
> >>> cross(['a0', 'a1', 'a2'], ['b0', 'b1'], ['c0', 'c1', 'c2', 'c3'])
> <generator object at 0xb7df072c>
> >>> list(_)
> [('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')]
More information about the Python-list
mailing list