1

这肯定是重复的,但假设我有一个类如下:

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 已经进行了相应的排序。

4

3 回答 3

5

sorted() 从不修改原始数据。要使其与自定义对象一起工作,您必须实现__iter__(返回 eg iter(self._data))-但这只会为您提供该对象的排序版本,既不会修改原始对象,也不会对两个列表进行排序。

你想要的是一个sort()你称之为yourobj.sort(). 然后,此方法将.sort()使用适当的key参数调用列表,以按照您希望的方式对其进行排序。

于 2013-06-06T06:26:13.067 回答
3

你不能sorted返回你的类的一个实例。 sorted总是返回一个列表。如果将其设为迭代器,则可以sorted返回类数据的排序版本(作为列表)。但是给你的类提供一个方法sort来对它的数据进行排序可能更简单。

于 2013-06-06T06:25:20.953 回答
3

您可以定义这样的sort方法

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

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

于 2013-06-06T06:34:40.177 回答