我在这里遇到了这个功能。
我对如何实现感到困惑- key通过生成的函数如何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方法的调用。
__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。
[1, 2, 3]
[K(1), K(2), K(3)]
K(1)
K(2)
K(1).__lt__(K(2))
mycmp(1, 2) < 0
无论如何 ,这就是旧cmp方法的工作 方式 ;根据第一个参数是否小于,等于或大于第二个参数,返回-1、0或1。代理键将这些数字转换回比较运算符的布尔值。
代理密钥绝不需要知道有关 绝对位置的 任何信息。它只需要知道 一个 它正在与其他比较对象和特殊方法挂钩提供了其他对象。