【问题标题】:Python - Get sorted list of user-defined classesPython - 获取用户定义类的排序列表
【发布时间】:2011-12-17 23:35:51
【问题描述】:

我有一堂课:

class Prediction():
    def __init__(self, l):
        self.start = l[0]
        self.end = l[1]
        self.score = l[2]

还有一个列表,其中每个元素都是一个Prediction。它被恰当地命名为predictions

我想按Prediction 类的start 属性对predictions 进行排序。

类似这样的:

predictions_start_order = sorted(predictions, key=start)

这不起作用。我错过了什么?

【问题讨论】:

    标签: python class list user-defined-types


    【解决方案1】:

    sortedkey 参数采用 函数,而不是属性。您正在寻找的是:

    class Prediction():
        def __init__(self, l):
            self.start = l[0]
            self.end = l[1]
            self.score = l[2]
    
        def __lt__(self, other):
            return self.start < other.start
    

    这将允许sorted 自动订购此类的可迭代实例。

    实际上只需要__lt__ 在Python 中进行排序,但PEP8 建议您实现所有丰富的比较或使用total_ordering 装饰器。

    【讨论】:

    • FWIW,PEP 8 建议定义所有六个丰富的比较,而不是依赖于使用 lt 的实现。或者,您可以使用 functools.total_ordering 来填写缺少的方法。
    • @RaymondHettinger 根据您之前对我的另一篇帖子的评论,已经包含了这一点:) 只是想在添加细节之前获得核心答案。
    • 我喜欢这种解决方案,因为您总是要按一个字段进行排序。例如,如果startPrediction 类的键,我更喜欢这种方法。
    【解决方案2】:
    predictions_start_order = sorted(predictions, key=lambda x: x.start)
    

    【讨论】:

    • 如果要使用按键功能,请使用operator.attrgetter('start') 而不是lambda
    • @agf 为什么?实际上我发现这个符号的可读性要差很多。
    • @agf 我不喜欢 operator.attrgetter 需要额外导入的事实。我认为这两种解决方案都是可读的。
    • 不管怎样,operator.attrgetter('start')lambda x: x.start 快。
    猜你喜欢
    • 2011-11-01
    • 2015-02-09
    • 2012-08-04
    • 2011-05-04
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多