如何基于对象的属性对对象列表进行sorting?

我有一个Python对象列表,我想按照对象本身的属性进行sorting。 该列表看起来像:

>>> ut [<Tag: 128>, <Tag: 2008>, <Tag: <>, <Tag: actionscript>, <Tag: addresses>, <Tag: aes>, <Tag: ajax> ...] 

每个对象都有一个计数:

 >>> ut[1].count 1L 

我需要按照降序的数量对列表进行sorting。

我已经看到了几种方法,但我正在寻找Python的最佳做法。

 # To sort the list in place... ut.sort(key=lambda x: x.count, reverse=True) # To return a new list, use the sorted() built-in function... newlist = sorted(ut, key=lambda x: x.count, reverse=True) 

更多按键sorting»

最快的方法是使用operator.attrgetter("count") ,特别是当列表中有很多logging的时候。 但是,这可能会运行在Python的预运算符版本上,所以最好有一个回退机制。 您可能需要执行以下操作:

 try: import operator except ImportError: cmpfun= lambda x: x.count # use a lambda if no operator module else: cmpfun= operator.attrgetter("count") # use operator since it's faster than lambda ut.sort(key=cmpfun, reverse=True) # sort in-place 

读者应该注意到key =方法:

 ut.sort(key=lambda x: x.count, reverse=True) 

比将丰富的比较运算符添加到对象要快很多倍。 我很惊讶地看到这个(“果壳里的Python”第485页)。 您可以通过在这个小程序上运行testing来确认这一点:

 #!/usr/bin/env python import random class C: def __init__(self,count): self.count = count def __cmp__(self,other): return cmp(self.count,other.count) longList = [C(random.random()) for i in xrange(1000000)] #about 6.1 secs longList2 = longList[:] longList.sort() #about 52 - 6.1 = 46 secs longList2.sort(key = lambda c: c.count) #about 9 - 6.1 = 3 secs 

我的testing显示,第一类速度比速度慢了10倍以上,但是这本书的速度只有普通速度的5倍左右。 他们说的原因是由于python( timsort )中使用的高度优化的sortingalgorithm。

不过,它的奇怪的.sort(lambda)比普通的旧的.sort()更快。 我希望他们解决这个问题。

 from operator import attrgetter ut.sort(key = attrgetter('count'), reverse = True) 

它看起来很像Django ORM模型实例的列表。

为什么不按这样的查询来sorting呢:

 ut = Tag.objects.order_by('-count') 

将丰富的比较运算符添加到对象类中,然后使用列表的sort()方法。
在Python中查看丰富的比较 。


更新 :虽然这种方法可行,但我认为从三联的解决scheme更适合您的情况,因为方式更简单。