Efficient implementation of deeply nested lists

Fuzzyman fuzzyman at gmail.com
Thu Jan 19 06:15:09 EST 2006


Kay Schluehr wrote:
> I want to manipulate a deeply nested list in a generic way at a
> determined place. Given a sequence of constant objects a1, a2, ..., aN
> and a variable x. Now construct a list from them recursively:
>
> L = [a1, [a2, [....[aN, [x]]...]]
>
> The value of x is the only one to be changed. With each value of x a
> new instance of L is needed so that we actually have a function:
>
> L = lambda x: [a1, [a2, [....[aN, [x]]...]]
>
> I'm seeking for an efficient implementation that does not recompute the
> whole list each time. Any ideas?
>

Is the sequence of a1 to aN fixed ?

I assume you want a new list each time ?

You can create a reference list once but keep a reference to the most
deeply nested part that contains x.

Each time you need a new copy, insert hte new value of x and use
copy.deepcopy to produce your new list.

***WARNING UNTESTED****

def listmaker(consts, x):
    global finalref
    out = []
    if not consts:
        finalref = [x]
        return finalref
    entry = consts.pop()
    out.append(entry)
    out.append(listmaker(consts, x))
    return out

listmaker recursively builds the list structure and creates a global
reference to the list holding x.

You can build this once as a 'generic' list.

When you need a copy do :

del finalref[0]
finalref.append(newx)

newlist = copy.deepcopy(reference_list)

I hope that helps, it may need debugging. :-)

Because lists are mutable, you can't avoid the copy operation - but it
is *probably* quicker than recomputing hte list. You should test this -
as it might not be the case.

Fuzzyman
http://www.voidspace.org.uk/python/index.shtml

> Kay




More information about the Python-list mailing list