小编典典

Python的cmp_to_key函数如何工作?

algorithm

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

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


阅读 465

收藏
2020-07-28

共1个答案

小编典典

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。代理键将这些数字转换回比较运算符的布尔值。

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

2020-07-28