7

我有一个向量数组,我想按长度对它们进行排序:

class Vector:

     def __init__(self, x, y):
       self.x, self.y = x, y

     def __add__(a, b):
       return Vector(a.x + b.x, a.y + b.y)

     def __str__(a):
       return str(a.x) + ' ' + str(a.y) + '\n'

     def __key__(self):
       return self.x * self.x + self.y * self.y


a = []
a.append(Vector(1,2))
a.append(Vector(1, 1))
a.sort()
print("".join(map(str,a)))

它说:“不可排序的类型:Vector() < Vector()”它要我创建lt, gt.. 方法。但我想在不使用的情况下进行排序cmp。可能吗?

4

3 回答 3

7

我将实现__lt__然后__eq__使用functools.total_ordering类装饰器来获取其余的比较方法。

如果像这样对向量进行排序没有意义,那么您始终可以使用key关键字来sort(或sorted就此而言):

mylist.sort(key = lambda v: v.x**2 + v.y**2)
于 2012-08-28T11:36:13.787 回答
6

您在这里有两种变体:__cmp__在类中实现函数Vector或以这种方式执行排序:

...
a.sort(key=Vector.__key__) 
于 2012-08-28T11:37:58.947 回答
2

Python 文档说lt/le/gt/ge/eq/ne 是

[...] 所谓的“丰富的比较”方法,并且优先于 __cmp__() 调用比较运算符

如果你实现一个__cmp__(self, other)方法,它应该用于比较/排序操作。

于 2012-08-28T11:35:33.890 回答