当我们自定义一个对象时,如果想要对这些对象进行排序,我们可以使用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程序按属性对自定义对象的元组进行排序的方法及示例说明。