François Pinard pinard at
Mon Aug 26 20:23:05 CEST 2002

[Jon Cosby]

> I want to extend this to any size, but I'm having problems with iteration.

Fun, I read your message just after having written a little tool able to
nest an arbitrary number of loops.  Maybe it could help?  Python 2.2 needed.

from __future__ import generators

# All generators below have the property of yielding successive results
# in sorted order, given than input sequences were already sorted.

def cartesian(*sequences):
Generate the "cartesian product" of all SEQUENCES.  Each yielded result
is a list containing an element taken from each original sequence.
    if len(sequences) == 0:
        yield []
        first, remainder = sequences[0], sequences[1:]
        for element in first:
            for result in cartesian(*remainder):
                result.insert(0, element)
                yield result

# [reminder deleted]

For example, you could use it this way in your application:

   for indices in cartesian(*rows):

and then within the loop, `indices' holds [i, j, k, ...] as if you nested
as many loops as you have rows.  You get the idea.  I leave you with the
problem of generalising named indices into indexed indices. :-)

François Pinard

More information about the Python-list mailing list