我想写一个自定义的键函数,我看到在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
型
3条答案
按热度按时间kyxcudwk1#
key函数需要返回一个元组,其中包含绝对值和值符号的可排序指示符。
abs()
将给予绝对值value >= 0
可以用符号排序;负值产生False
,其排序在True
之前。翻译成
lambda
就是:字符串
关键函数产生:
型
Python会使用它来对列表进行排序。由于元组是逐个元素比较的,并且第一个不相等的值决定了它们的顺序,这意味着
False
/True
符号标志仅在第一个元素相等时使用,例如当比较(2, False)
(-2)与(2, True)
(2)时。7uzetpgm2#
为了完整起见,我想指出的是,覆盖自定义对象上的比较方法是自定义排序操作的另一种方式。
如果自定义键函数变得太复杂而无法处理,这可能是一种值得的方法。
引用
functools.total_ordering
的文档:给定一个类定义了一个或多个丰富的比较排序方法,这个类装饰器提供其余的方法。这简化了指定所有可能的富比较操作所涉及的工作:
类必须定义__lt__()、le()、gt()或__ge__()之一。另外,类应该提供一个__eq__()方法。
举例来说:
字符串
kpbpu0083#
这是简单的方式:
arr.sort(key=abs)