Help, replacing the actual value from a data strucutre in a iterator

Jim Jinkins j-jinkins at usa.net
Sat Jan 4 12:43:42 EST 2003


george hart wrote:

>Hello,
>
>My problem is that I have a very complex data structure I need to
>iterate over and change certain values to.  I wrote a 'generator' to
>iterate over my data structure but when i call the next() method in
>the generator object I am returned a value that cannot be used to
>modifiy the original data structure.
>
>Here is a simplified version of my problem:
>
>a=[0,1,2,[20,30,40],9,3]
>def generator(l):
>    for i in l:
>        if type(i) is list:
>            for q in generator(i):
>                yield q
>        else:
>            yield i
>
>g=generator(a)
>o=g.next()
>o=100   # where i want this assignment to change a[0] to 100
>print a[0]  #thus a[0] would then print out 100
>
>
>Thanks for any help,
>George.
>  
>
from __future__ import generators
a=[0,1,2,[20,30,40],9,3]
def generator(l):
    for i in range(len(l)):
        if type(l[i]) is list:
            for q in generator(l[i]):
                yield q
        else:
            yield l, i

g = generator(a)
for x in g:
    print "x=%s" % str(x)

g = generator(a)
o, i = g.next()
print "o=%s    i=%s" % (str(o), i)
o[i] = 100
print "Now o[0]=%s" % o[0]


If the object structure to be traversed is more complex than list within 
list, then return a mutable object.  The generator will become more 
complex too.

from __future__ import generators
a=[0,1,2,[20,30,40],9,3]

class RefList:
    def __init__(self, l, i):
        self.l = l
        self.i = i

    def get(self):
        return self.l[self.i]

    def set(self, x):
        self.l[self.i] = x

def generator(l):
    for i in range(len(l)):
        if type(l[i]) is list:
            for q in generator(l[i]):
                yield q
        else:
            yield RefList(l, i)

g = generator(a)
ref = g.next()
print "ref.val=%s" % ref.get()
ref.set(100)
print "now ref.val=%s" % ref.get()

    Jim Jinkins







More information about the Python-list mailing list