详解Python按属性对自定义对象的元组进行排序

  • Post category:Python

当我们自定义一个对象时,如果想要对这些对象进行排序,我们可以使用sorted()函数。需要注意的是,sorted函数在排序时会调用对象的__lt__方法,如果我们没有对这个方法进行定义,sorted函数就无法对我们的对象进行排序。

以下是对Python程序按属性对自定义对象的元组进行排序的完整攻略:

定义自定义对象类

class MyClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "MyClass({}, {})".format(self.a, self.b)

    def __lt__(self, other):
        return self.a < other.a

在自定义对象类中,我们需要实现__lt__方法,该方法用于比较两个对象是否小于(less than)另一个对象,这里我实现的比较是比较对象的a属性的大小。

创建自定义对象元组列表

my_list = [(2, 3), (1, 4), (5, 1)]
my_obj_list = [MyClass(a, b) for a, b in my_list]

这里我们将一个由元组组成的列表转换为由自定义对象组成的列表。

对自定义对象元组进行排序

sorted_list = sorted(my_obj_list)
print(sorted_list)

使用sorted函数对自定义对象元组进行排序,排序依据是对象的a属性的大小。输出结果:

[MyClass(1, 4), MyClass(2, 3), MyClass(5, 1)]

示例说明:按元组中的第二个元素进行排序

如果我们要按元组中的第二个元素进行排序,我们只需要修改__lt__方法。

class MyClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "MyClass({}, {})".format(self.a, self.b)

    def __lt__(self, other):
        return self.b < other.b

改为比较对象的b属性的大小。

现在再执行上述三个步骤,输出的结果为:

[MyClass(5, 1), MyClass(2, 3), MyClass(1, 4)]

示例说明:按元组中的第一个元素进行排序,如果第一个元素相同则按第二个元素进行排序

class MyClass:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "MyClass({}, {})".format(self.a, self.b)

    def __lt__(self, other):
        if self.a == other.a:
            return self.b < other.b
        else:
            return self.a < other.a

这里实现的是如果第一个元素相同时,才比较第二个元素的大小,否则只按第一个元素的大小进行排序。

现在再执行上述三个步骤,输出的结果为:

[MyClass(1, 4), MyClass(2, 3), MyClass(5, 1)]

以上就是Python程序按属性对自定义对象的元组进行排序的方法及示例说明。