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