17

在 Python 2.4 中,您可以传递自定义比较器进行排序。

让我们来看看名单——

list=[5,1,2,3,6,0,7,1,4]

要先用偶数排序,然后再用赔率排序,我们可以执行以下操作 -

evenfirst=lambda x,y:1 if x%2>y%2 else -1 if y%2>x%2 else x-y
list.sort(cmp=evenfirst)
list == [0, 2, 4, 6, 1, 1, 3, 5, 7] # True

在 Python 3 中,您只能通过key(Python 2.4 也支持)。

当然,在 Python 3 中也可以通过 right 实现相同的排序key

list.sort(key=lambda x:[x%2,x])

我对不再支持自定义比较器的决定感到好奇,尤其是当它似乎可以很容易地实现时。

是否在所有或大多数情况下,所需的排序顺序都有自然的key

例如,在上面的示例中,存在这样的键 - 实际上使用它的代码变得更加简洁。总是这样吗?

(我知道这种将比较器转换为键的方法,但理想情况下,如果可以将其内置到语言中,则不必采取这种变通方法。)

4

2 回答 2

7

表现。

cmp每次排序算法需要在两个元素之间进行比较时,都会调用该函数。

相反,key对象可以被缓存。即排序算法只需要为每个元素获取一次key,然后比较key。它不需要为每次比较都获取一个新密钥。

于 2013-09-04T15:03:29.390 回答
6

按键排序是明确定义的,这意味着结果不取决于您使用的(稳定的)排序算法。没有病理性关键功能。您可能会建议random.random(),但这只是打乱列表。

而使用比较函数的排序只有在函数是传递和反对称的情况下才被明确定义,Python 既无法测试也无法证明。如果你按废话比较函数排序会发生什么lambda(x, y): 1?你不能说,结果取决于算法。有些算法甚至可能不会终止。

于 2013-09-04T15:45:23.327 回答