How to sort by a particular attribute of a class?

Issue

I have a model with an attribute which keeps track of the price. Right now, I have a list of that certain model. Is there anyway to rearrange the list to sort by that particular attribute? Is python smart enough to know that the attribute is a value which can be sorted? I am not keeping keeping track of the instances of a particular model using a database (it is not needed for what I am doing, so I cannot just retrieve the instances from the database in sorted order)
Thanks!

Solution

You can use the inbuilt sorted function, together with a custom-made function that returns the price of an object:

class Dummy(object) :
    pass

def getPrice(obj) :
    return obj.price

d0 = Dummy()
d0.price = 56.
d1 = Dummy()
d1.price=16.

d2 = Dummy()
d2.price=786.

d3 = Dummy()
d3.price=5.5

elements = [d0, d1, d2, d3]

print 'Pre-sorting:'
for elem in elements :
    print elem.price

sortedElements = sorted(elements, key=getPrice)

print 'Post-sorting:'
for elem in sortedElements :
    print elem.price

This would also work via any method of your class that returns the price, e.g.

class Dummy(object) :
    def __init__(self, price) :
        self._price = price
    def getPrice(self) :
        return self._price

...

sortedElements = sorted(elements, key = Dummy.getPrice)

See http://wiki.python.org/moin/HowTo/Sorting/ for more.

Answered By – juanchopanza

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published