Kirk Strauser wrote:
At 2008-12-15T19:06:16Z, Reckoner <recko...@gmail.com> writes:

The problem is that I don't know ahead of time how many lists there are or
how deep they go. In other words, you could have:

Recursion is your friend.

Write a function to unpack one "sublist" and call itself again with the new
list.  For instance, something like:

def unpack(pattern):
    # Find the first subpattern to replace
    # [...]
    results = []
    for number in subpattern:
        results.append(pattern.replace(subpattern, number))
    return results

Calling unpack([1,2,3,[5,6],[7,8,9]]) would look cause it to call
unpack([1,2,3,5,[7,8,9]]) and unpack([1,2,3,6,[7,8,9]]), compile the
results, and return them.

Along these lines generators are the bees knees.

def expands(source):
    '''Nested lists to list of flat lists'''
    for n, val in enumerate(source):
        if isinstance(val, list):
            assert val, 'empty list @%s in %s undefined.' % (
                           n, len(source))
            head = source[: n]
            tail = source[n + 1 :]
            for element in val:
                for row in expands(head + [element] + tail):
                    yield row
            break
    else:
        if source: # Just to make expands([]) return an empty list)
            yield source

def answer(source):
'''Do the requested printing'''
    for row in expands(source):
        print '-'.join(str(x) for x in source)

--Scott David Daniels
scott.dani...@acm.org
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to