对类实例Python列表进行排序

59 python sorting

我有一个类实例列表 -

x = [<iteminstance1>,...]
Run Code Online (Sandbox Code Playgroud)

除了其他属性之外,该类具有score属性.如何根据此参数按升序对项目进行排序?

编辑:list在python中有一些东西叫做sort.我可以在这里用吗?如何指示此函数使用我的score属性?

kin*_*all 142

除了您接受的解决方案之外,您还可以__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()
Run Code Online (Sandbox Code Playgroud)

  • 如果您无权访问排序函数,这将特别有用。当 sorted 被一些其他模块(例如标准库模块)调用时会发生这种情况。示例 - `queue` 调用中的 `priorityqueue` 为您提供的项目排序。 (3认同)
  • @BimleshSharma然后根据您希望实例比较的方式编写`__lt__`方法,例如`return(self.text,self.num)<(other.text,other.num)`. (3认同)
  • 我花了一些时间才弄清楚 `list.sort()` 对现有列表进行排序(并返回 `NoneType`),而 `sorted(list)` 返回列表的排序副本。 (3认同)

Ned*_*der 95

import operator
sorted_x = sorted(x, key=operator.attrgetter('score'))
Run Code Online (Sandbox Code Playgroud)

如果您想要就地排序x,您还可以:

x.sort(key=operator.attrgetter('score'))
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用Python!为了完整性:srot函数/方法的"key"参数接受函数作为其参数.运算符模块为通常由语言语法本身完成的任务提供有用的函数 - 就像"添加"函数一样,语言中的"+"标记也是如此,在这种情况下,attrgetter也会这样做" "连接符在语法中."key"的其他参数可以是用"lambda"定义的就地函数.在这种情况下,sorted_x = sorted(x,lambda x:x.score)) - 也会起作用.但是,给出的例子更好. (7认同)
  • 哇!有那么简单吗!!刚查过。这是 :) (2认同)
  • 我不确定使用`attrgetter`会更好。Lambdas看起来也一样快,而且看起来更干净。 (2认同)