Using s.sort([cmp[, key[, reverse]]]) to sort a list of objects based on a attribute
Tim Golden
mail at timgolden.me.uk
Fri Sep 7 10:15:46 EDT 2007
cjt22 at bath.ac.uk wrote:
> Hi there
>
> I am fairly new to Python and have not really used regular expressions
> before (I think this might be needed for my query) and wondered if you
> could help
>
> I have a step class and store in a list step instances
> A step instance contains variables: name, startTime etc and startTime
> is stored as a string %H:%M:%S
>
> What I would like to do is to be able to sort this list of objects
> based on the startTime object so that the first item in the list is
> the object with the earliest Start time and last item is the object
> with the last Start time.
>
> I belive my key has to be = strpTime(step.sTime, "%H:%M:%S")
> But don't know how to create the comparison funciton.
You're going to get a *lot* of answers on this one!
To start the ball rolling...
<code>
import random
class Step:
def __init__ (self, name, startTime):
self.name = name
self.startTime = startTime
def __cmp__ (self, other):
return cmp (self.startTime, other.startTime)
def __str__ (self):
return str (self.startTime)
__repr__ = __str__
steps = [Step (h, "%02d:00:00" % h) for h in range (10)]
random.shuffle (steps)
print "Shuffled:", steps
steps.sort ()
print "Sorted:", steps
</code>
In this case, I've given the class a ordering-semantic based
on its startTime attribute. Obviously, this only makes sense
if you *always* want your class to sort this way, rather than
in this one instance.
To do it on a per-sort basis, you *could* create simple per-sort
equivalent:
<code fragment>
def compare_by_startTime (one, other):
return cmp (one.startTime, other.startTime)
steps.sort (cmp=compare_by_startTime)
</code>
or, in the case you're asking about, you could use the
operator module's attrgetter function to do what you want:
<code fragment>
import operator
steps.sort (key=operator.attrgetter ("startTime"))
</code>
TJG
More information about the Python-list
mailing list