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