Python中类的__key__参数

emi*_*ess 7 python sorting key

我有一个向量数组,我想按长度排序:

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)))
Run Code Online (Sandbox Code Playgroud)

它说:"无法解决的类型:Vector()<Vector()"它要我创建lt,gt..方法.但是我想在不使用的情况下排序cmp.可能吗?

mgi*_*son 6

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

如果让你的矢量这样排序没有意义,那么你总是可以只使用key关键字sort(或者sorted就此而言):

mylist.sort(key = lambda v: v.x**2 + v.y**2)
Run Code Online (Sandbox Code Playgroud)


Ale*_*yev 6

这里有两个变体:__cmp__Vector类中实现函数或以这种方式执行排序:

...
a.sort(key=Vector.__key__) 
Run Code Online (Sandbox Code Playgroud)

  • @lazyr肯定不行!`__len__`是序列*的长度*; Python期望它返回一个整数.(此外,当前返回的值是长度的平方.) (4认同)
  • @lazyr - 我同意`__key__`不是最好的名字的原则(即使除了它可能意味着将来某些特定的东西,它不是非常具体),但是`__len__`有点可疑,因为` help(len)`表示它是"序列或映射的项目数".我可能会将它定义为一个名为`norm`的单独函数(不是一个方法). (2认同)
  • 另外,值得指出的是__cmp__在python 3.x中消失了。(OP *可能*正在使用) (2认同)

Céd*_*ien 2

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

\n\n
\n

[...] 所谓的 \xe2\x80\x9crich 比较 \xe2\x80\x9d 方法,并优先于 __cmp__() 调用\n 比较运算符

\n
\n\n

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

\n

  • 值得指出的是,Python 3.x 中不再使用 `__cmp__` (4认同)