如何根据对象的属性对对象列表进行排序?

2024-04-26 02:51:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python对象列表,我想根据对象本身的属性对其进行排序。列表如下:

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

每个对象都有一个计数:

>>> ut[1].count
1L

我需要按计数降序对列表进行排序。

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


Tags: 对象方法列表属性排序addressestagcount
3条回答
# 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 by keys的更多信息。

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

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

比向对象添加丰富的比较运算符快很多倍。我很惊讶地读到这篇文章(见“简单的Python”第485页)。您可以通过对这个小程序运行测试来确认这一点:

#!/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

我的,非常小的,测试显示第一种速度慢了10倍多,但书上说它一般只慢了5倍左右。他们之所以这么说,是因为python中使用了高度优化的排序算法(timsort)。

不过,非常奇怪的是.sort(lambda)比普通的old.sort()要快。我希望他们能解决这个问题。

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

try: import operator
except ImportError: keyfun= lambda x: x.count # use a lambda if no operator module
else: keyfun= operator.attrgetter("count") # use operator since it's faster than lambda

ut.sort(key=keyfun, reverse=True) # sort in-place

相关问题 更多 >