Newbie: changing an attribute of objects in a list

Ben Simuyandi bsimuyandi at africonnect.com
Thu Jun 12 05:11:01 EDT 2003


Example objects in a list [a,b,...,i]:

a.age=100
a.order=1
b.age=200
b.order=1
c.age=300
c.order=1
d.age=400
d.order=1
e.age=500
e.order=1
f.age=600
f.order=1
g.age=50
g.order=1
h.age=700
h.order=1
i.age=150
i.order=1

should return a list with values:

a.age=100
a.order=9
b.age=200
b.order=6
c.age=300
c.order=5
d.age=400
d.order=4
e.age=500
e.order=3
f.age=600
f.order=2
g.age=50
g.order=9
h.age=700
h.order=1
i.age=150
i.order=7

and another example list:

a.age=100
a.order=1
b.age=200
b.order=2
c.age=300
c.order=3
d.age=400
d.order=4
e.age=500
e.order=4
f.age=600
f.order=5
g.age=50
g.order=6
h.age=700
h.order=7
i.age=150
i.order=8

should return:

a.age=100
a.order=1
b.age=200
b.order=2
c.age=300
c.order=3
d.age=400
d.order=4
e.age=500
e.order=5
f.age=600
f.order=6
g.age=50
g.order=7
h.age=700
h.order=8
i.age=150
i.order=9

Thanks,
Ben

"Steven Taschuk" <staschuk at telusplanet.net> wrote in message
news:20030611120656.F1157 at tibia.amotlpaa.bogus...
> Quoth Ben Simuyandi:
> > OK, I've read a bit and I've now changed the code. If anyone would like
to
> > give feedback (better ways of doing it, where am I going wrong) that
would
> > be appreciated:
>   [...]
>
> It would be nice to see an example list of objects and the desired
> result for that list.
>
> Without that, here's one possible, simple-minded and completely
> untested notion:
>
>     # separate items into groups by x.order
>     d = {}
>     for x in items:
>         d.setdefault(x.order, []).append(x)
>
>     # resolve conflicts
>     orders = d.keys()
>     orders.sort()
>     for order in orders:
>         # sort descending by age
>         assert len(d[order]) > 0
>         decorated = [(x.age, -i, x) for x in enumerate(d[order])]
>         decorated.sort()
>         decorated.reverse()
>         sorted = [x for _, _, x in decorated]
>         del decorated
>
>         # Replace the list d[order] with its oldest element.
>         # Put the remaining elements, in reverse order of age, into
>         # d[order+1], d[order+2], etc.
>         # If one of those is found already to have elements,
>         # just dump all the remaining elements in that list; the
>         # loop over the orders will then pick up at that point.
>
>         # (Note how this makes it okay to be mutating the dict and
>         # iterating over an independent list of the original keys.)
>
>         del d[order]
>         for i, x in enumerate(sorted):
>             if order+i not in d:
>                 d[order+i] = x
>             else:
>                 d[order+i].extend(sorted[i:])
>                 break
>
>     # assign .order attributes
>     for order, x in d.iteritems():
>         x.order = order
>
> This uses enumerate(), a new built-in in Python 2.3; in 2.2 you
> can write it yourself, like this:
>
>     from __future__ import generators
>
>     def enumerate(items):
>         i = 0
>         for x in items:
>             yield i, x
>             i = i + 1
>
> --
> Steven Taschuk                staschuk at telusplanet.net
> "I tried to be pleasant and accommodating, but my head
>  began to hurt from his banality."   -- _Seven_ (1996)
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>








More information about the Python-list mailing list