Python的cmp_to_key函数如何工作?

我在这里遇到了这个功能。

我对如何实现感到困惑- key通过生成的函数如何cmp_to_key知道给定元素应该在哪个“位置”而不检查给定元素与感兴趣的其他元素的比较方式?

回答:

cmp_to_key方法返回一个充当代理键的特殊对象:

class K(object):

__slots__ = ['obj']

def __init__(self, obj, *args):

self.obj = obj

def __lt__(self, other):

return mycmp(self.obj, other.obj) < 0

def __gt__(self, other):

return mycmp(self.obj, other.obj) > 0

def __eq__(self, other):

return mycmp(self.obj, other.obj) == 0

def __le__(self, other):

return mycmp(self.obj, other.obj) <= 0

def __ge__(self, other):

return mycmp(self.obj, other.obj) >= 0

def __ne__(self, other):

return mycmp(self.obj, other.obj) != 0

def __hash__(self):

raise TypeError('hash not implemented')

排序时,每个键将与序列中的大多数其他键进行比较。位于位置0的这个元素是否小于或大于另一个对象?

每当发生这种情况时,就会调用__lt__或调用特殊的方法挂钩,__gt__代理键将其转换为对该cmp方法的调用。

因此,该列表[1, 2, 3]的排序方式为[K(1), K(2),

K(3)],如果K(1)将其与K(2)进行比较,以查看其是否K(1)较低,则将K(1).__lt__(K(2))其调用,并转换为mycmp(1,

2) < 0

无论如何 ,这就是旧cmp方法的工作 方式

;根据第一个参数是否小于,等于或大于第二个参数,返回-1、0或1。代理键将这些数字转换回比较运算符的布尔值。

代理密钥绝不需要知道有关 绝对位置的 任何信息。它只需要知道 一个 它正在与其他比较对象和特殊方法挂钩提供了其他对象。

以上是 Python的cmp_to_key函数如何工作? 的全部内容, 来源链接: utcz.com/qa/406327.html

回到顶部