如何使类数据可排序

时间:2013-06-06 06:21:42

标签: python sorting

这肯定是重复的,但是说我有一个课程如下:

class MyObj(object):
    def __init__(self, *args, **kwargs):
        self._data = [2, 1, 3]
        self._more_data = [False, True, False]

如何使其可以排序,而不是针对其他MyObj对象(我可以使用__lt__),但是在内部?因此,如果我致电sorted(my_obj_instance),我会获得一个包含以下数据的版本:

self._data = [1,2,3]
self._more_data [True, False, False]

也就是说,_data按数字排序,_more_data已相应排序。

3 个答案:

答案 0 :(得分:5)

sorted() 从不修改原始数据。要使它与自定义对象一起工作,你必须实现__iter__(返回例如iter(self._data)) - 但这只会给你一个该对象的排序版本,既不修改原始对象也不排序两个清单。

您想要的是sort()方法,您可以将其称为yourobj.sort()。然后,此方法将使用适当的.sort()参数调用列表上的key,以便您对它们进行排序。

答案 1 :(得分:3)

您无法让sorted返回班级的实例。 sorted始终返回一个列表。如果你使它an iterator,你可以让sorted返回你班级数据的排序版本(作为列表)。但是,为您的类提供一个名为sort的方法来排序其数据可能更简单。

答案 2 :(得分:3)

您可以像这样定义sort方法

def sort(self)
    self._data, self._more_data = zip(*sorted(zip(self._data, self._more_data)))

这会将两个属性压缩为2元组。是否对2元组列表进行排序并再次解压缩它们。