如何按类的特定属性排序?

时间:2011-03-20 09:04:00

标签: python django

我有一个具有跟踪价格的属性的模型。现在,我有一个特定型号的清单。无论如何重新排列列表以按特定属性排序? python足够聪明,知道该属性是一个可以排序的值吗?我没有使用数据库跟踪特定模型的实例(我不需要它,所以我不能只按排序顺序从数据库中检索实例) 谢谢!

4 个答案:

答案 0 :(得分:4)

您可以使用内置的sorted函数以及返回对象价格的自定义函数:

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

这也适用于您的类的任何返回价格的方法,例如

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

...

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

有关详情,请参阅http://wiki.python.org/moin/HowTo/Sorting/

答案 1 :(得分:2)

或者你可以使用“operator.attrgetter()”:

list_of_objects.sort(key=operator.attrgetter('name_of_attribute_to_sort_by'))

答案 2 :(得分:0)

要进行就地排序,您可以使用.sort list方法,使用定义要排序的键的函数。

>>> class Data(object):
...     def __init__(self,x,y):
...             self.x=x
...             self.y=y
... 
>>> l=[Data(i,i+1) for i in xrange(10,-1,-1)]
>>> print ", ".join("%s %s"%(x.x,x.y) for x in l)
10 11, 9 10, 8 9, 7 8, 6 7, 5 6, 4 5, 3 4, 2 3, 1 2, 0 1
>>> l.sort(key=lambda obj:obj.y)
>>> print ", ".join("%s %s"%(x.x,x.y) for x in l)
0 1, 1 2, 2 3, 3 4, 4 5, 5 6, 6 7, 7 8, 8 9, 9 10, 10 11

要在保持原始版本完整的同时获取另一个list,请使用sorted函数,同时定义可选的key参数。

答案 3 :(得分:0)

最好看的地方是http://wiki.python.org/moin/HowTo/Sorting

就个人而言,类__cmp__函数在处理类时更加方便,因为通常你总是希望以相同的方式对它们进行排序。

以下是一些简单的例子:

class Foo :
    def __init__(self, x, y) :
        self.x = x
        self.y = y

    def __cmp__(self, x) :
        return cmp(self.x, x)

    def __repr__(self) :
        return "Foo(%d)" % self.x

# Simple list of objects
data = [
    Foo(1, 99),
    Foo(5, 94),
    Foo(6, 93),
    Foo(2, 97),
    Foo(4, 95),
    Foo(3, 96),
]

# sort using the __cmp__ class method - in numeric order
print sorted(data)

# sort using the key lambda, which reverse sorts... 
print sorted(data, key=lambda a : a.y)