Python3中的自定义键函数

uyto3xhc  于 2023-08-08  发布在  Python
关注(0)|答案(3)|浏览(110)

我想写一个自定义的键函数,我看到在Pramp。我习惯于使用类似的东西:

my_list.sort(key = lambda x: (x[1], -x[0]))

字符串
这次我需要一个更复杂的键函数,我意识到我不知道怎么写。如何在Python3中编写这样一个键函数进行排序?key函数应该返回哪个值?它的投入应该是什么?
我的关键功能(不工作)

def key_function(num1, num2):
  if abs(num1) < abs(num2):
    return num1
  if abs(num1) > abs(num2):
    return num2
  if num1 < num2:
    return num1
  if num1 > num2:
    return num2
  if num1 == num2:
    return num1


来自Pramp:
如果两个数字有相同的绝对值,按符号对它们进行排序,其中负数在正数之前。

input:  arr = [2, -7, -2, -2, 0]
output: [0, -2, -2, 2, -7]


他们的伪代码回答:

def compare(a, b):
        if abs(a) < abs(b): return -1
        if abs(a) > abs(b): return 1
        if a < b: return -1
        if a > b: return 1
        return 0

    arr.sort(cmp = compare)
    return arr

kyxcudwk

kyxcudwk1#

key函数需要返回一个元组,其中包含绝对值和值符号的可排序指示符。

  • abs()将给予绝对值
  • value >= 0可以用符号排序;负值产生False,其排序在True之前。

翻译成lambda就是:

my_list.sort(key=lambda v: (abs(v), v >= 0))

字符串
关键函数产生:

2 => (2, True)
-7 => (7, False)
-2 => (2, False)
 0 => (0, True)


Python会使用它来对列表进行排序。由于元组是逐个元素比较的,并且第一个不相等的值决定了它们的顺序,这意味着False/True符号标志仅在第一个元素相等时使用,例如当比较(2, False)(-2)与(2, True)(2)时。

7uzetpgm

7uzetpgm2#

为了完整起见,我想指出的是,覆盖自定义对象上的比较方法是自定义排序操作的另一种方式。
如果自定义键函数变得太复杂而无法处理,这可能是一种值得的方法。
引用functools.total_ordering的文档:
给定一个类定义了一个或多个丰富的比较排序方法,这个类装饰器提供其余的方法。这简化了指定所有可能的富比较操作所涉及的工作:
类必须定义__lt__()、le()、gt()或__ge__()之一。另外,类应该提供一个__eq__()方法。
举例来说:

@total_ordering
class Student:
    def _is_valid_operand(self, other):
        return (hasattr(other, "lastname") and
                hasattr(other, "firstname"))
    def __eq__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        if not self._is_valid_operand(other):
            return NotImplemented
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))

字符串

kpbpu008

kpbpu0083#

这是简单的方式:
arr.sort(key=abs)

相关问题