Iteration

François Pinard pinard at iro.umontreal.ca
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 []
    else:
        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   http://www.iro.umontreal.ca/~pinard




More information about the Python-list mailing list