这肯定是重复的,但是说我有一个课程如下:
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已相应排序。
答案 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元组列表进行排序并再次解压缩它们。