我正在重构我的一些旧代码,并且遇到了这个问题:
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()
来实现自定义排序。有人可以解释为什么这有效吗?
它记录了here。
sort()方法采用可选参数来控制比较。
cmp指定两个参数(列表项)的自定义比较函数,它应返回负数,零或正数,具体取决于第一个参数是否被认为小于,等于或大于第二个参数:cmp = lambda x,y :cmp(x.lower(),y.lower())。默认值为None。
作为旁注,这是实现相同排序的更好选择:
alist.sort(key=lambda x: x.foo)
或者:
import operator
alist.sort(key=operator.attrgetter('foo'))
查看Sorting How To,它非常有用。
就像这个例子。你想要排序这个列表。
[('c', 2), ('b', 2), ('a', 3)]
输出:
[('a', 3), ('b', 2), ('c', 2)]
你应该按第二项排序元组,然后是第一项:
def letter_cmp(a, b):
if a[1] > b[1]:
return -1
elif a[1] == b[1]:
if a[0] > b[0]:
return 1
else:
return -1
else:
return 1
最后:
只是sort(letter_cmp)
这在Python 3中不起作用。
您可以使用functools cmp_to_key来使旧式比较函数工作。
from functools import cmp_to_key
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
cmp_items_py3 = cmp_to_key(cmp_items)
alist.sort(cmp_items_py3)