【发布时间】:2011-04-29 22:44:10
【问题描述】:
我有一个类实例列表 -
x = [<iteminstance1>,...]
除其他属性外,该类还具有score 属性。如何根据此参数对项目进行升序排序?
编辑:python 中的list 有一个叫做sort 的东西。我可以在这里使用它吗?如何指示此函数使用我的 score 属性?
【问题讨论】:
我有一个类实例列表 -
x = [<iteminstance1>,...]
除其他属性外,该类还具有score 属性。如何根据此参数对项目进行升序排序?
编辑:python 中的list 有一个叫做sort 的东西。我可以在这里使用它吗?如何指示此函数使用我的 score 属性?
【问题讨论】:
除了您接受的解决方案之外,您还可以在类上实现特殊的__lt__()(“小于”)方法。然后sort() 方法(和sorted() 函数)将能够比较对象,从而对它们进行排序。但是,当您只根据该属性对它们进行排序时,这种方法效果最好。
class Foo(object):
def __init__(self, score):
self.score = score
def __lt__(self, other):
return self.score < other.score
l = [Foo(3), Foo(1), Foo(2)]
l.sort()
【讨论】:
queue 调用中的 priorityqueue 为您提供的项目排序。
__lt__ 方法,例如return (self.text, self.num) < (other.text, other.num).
list.sort() 对现有列表进行排序(并返回NoneType),而sorted(list) 返回列表的排序副本。
[(Foo,Bar)] 类型的东西会让sort() 之类的东西变得非常棘手。
import operator
sorted_x = sorted(x, key=operator.attrgetter('score'))
如果您想对 x 进行就地排序,您还可以:
x.sort(key=operator.attrgetter('score'))
【讨论】:
attrgetter 是否更好。 Lambdas 似乎同样快,而且 IMO 看起来更干净。
sorted(list, function)