Sort a list of Class Instances Python
我有一个类实例列表-
1
| x = [<iteminstance1>,...] |
在其他属性中,类具有score属性。如何根据此参数按升序对项目排序?
编辑:python中的list有一个叫做sort的东西。我可以在这里用这个吗?如何引导该函数使用我的score属性?
除了您接受的解决方案之外,您还可以在类上实现特殊的__lt__()方法("小于")。然后,sort()方法(和sorted()函数)将能够比较对象,从而对它们进行排序。然而,当您只在这个属性上对它们进行排序时,这是最有效的。
1 2 3 4 5 6 7 8 9 10
| 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调用为您提供的项目排序。
- 如果我们有两个参数的实例,比如foo[abc',3]
- @然后,bimleshsharma根据您希望实例进行比较的方式编写您的__lt__方法,例如return (self.text, self.num) < (other.text, other.num)。
1 2
| import operator
sorted_x = sorted(x, key=operator.attrgetter('score')) |
如果要就地对X进行排序,还可以:
1
| x.sort(key=operator.attrgetter('score')) |
- 真的!就这么简单!!刚刚检查过。它是:
- 欢迎来到Python!为了完整:srot函数/方法的"key"参数接受函数作为其参数。操作员模块为通常由语言语法本身完成的任务提供有用的函数,例如"添加"函数,与"+"标记在语言中的作用相同,在这种情况下,attrgetter的作用相同。连接器的语法为。"key"的其他参数可以是用"lambda"定义的就地函数。在这种情况下,sorted_x=sorted(x,lambda x:x.score))-也会起作用。不过,给出的例子更好。
- 我不确定使用attrgetter更好。在我看来,兰姆达斯也一样快,而且看起来更干净。
- 这太好了。同样感谢你的提问和回答!
- 有时候Python的简单让我害怕