【问题标题】:Sort a list of Class Instances Python [duplicate]对类实例列表进行排序Python [重复]
【发布时间】:2011-04-29 22:44:10
【问题描述】:

我有一个类实例列表 -

x = [<iteminstance1>,...]

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

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

【问题讨论】:

    标签: python sorting


    【解决方案1】:

    除了您接受的解决方案之外,您还可以在类上实现特殊的__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()
    

    【讨论】:

    • 如果您无权访问 sorted 函数,这将特别有用。当某些其他模块(例如标准库模块)调用 sorted 时,会发生这种情况。示例 - queue 调用中的 priorityqueue 为您提供的项目排序。
    • 如果我们有 2 个参数的实例,比如 Foo['abc',3]
    • @BimleshSharma 然后根据您希望实例比较的方式编写您的 __lt__ 方法,例如return (self.text, self.num) &lt; (other.text, other.num).
    • 我花了一点时间才发现list.sort() 对现有列表进行排序(并返回NoneType),而sorted(list) 返回列表的排序副本。
    • 另外非常有用的是您有严重嵌套的数据。拥有[(Foo,Bar)] 类型的东西会让sort() 之类的东西变得非常棘手。
    【解决方案2】:
    import operator
    sorted_x = sorted(x, key=operator.attrgetter('score'))
    

    如果您想对 x 进行就地排序,您还可以:

    x.sort(key=operator.attrgetter('score'))
    

    【讨论】:

    • 哇!有那么简单吗!!刚检查。它是:)
    • 欢迎使用 Python!为了完整起见:srot 函数/方法的“key”参数接受一个函数作为其参数。 operator 模块为通常由语言语法本身完成的任务提供有用的功能 - 就像一个“add”函数做同样的“+”标记在语言中做的事情,在这种情况下,attrgetter 做同样的事情“ . " 连接器在语法中起作用。 “key”的其他参数可以是用“lambda”定义的就地函数。在这种情况下, sorted_x = sorted(x, lambda x: x.score)) - 也可以。不过,给定的例子更好。
    • 我不确定使用attrgetter 是否更好。 Lambdas 似乎同样快,而且 IMO 看起来更干净。
    • 这太棒了。同样感谢您的问题和答案!
    • 这对我不起作用,这个效果更好:learningaboutelectronics.com/Articles/… 使用:sorted(list, function)
    猜你喜欢
    • 2021-10-29
    • 2020-01-21
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多