【发布时间】:2012-08-04 17:32:55
【问题描述】:
我正在重构我的一些旧代码并遇到了这个问题:
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
代码有效(我大约在 3 年前写了它!)但是我在 Python 文档的任何地方都找不到这个东西,每个人都使用 sorted() 来实现自定义排序。有人能解释一下为什么会这样吗?
【问题讨论】:
-
sorted()和sort()以几乎相同的方式提供自定义排序,以调用约定的差异为模。 -
确实,使用
key参数优于传递cmp函数。 (后者甚至没有在 Python 3 中实现) -
这有点模棱两可,取决于列表中的项目是什么;您的代码要求它们具有属性
foo,否则它会爆炸。最好为你的类定义一个自定义的__lt__()方法,然后sorted()和list.sort()可以开箱即用。 (顺便说一句,对象不再需要定义__cmp__(),只需__lt__()。See this