答案 0 :(得分:3)
如the sorted
docs中所述,您需要将比较函数作为cmp
参数传递而不是key
参数。所以
sorted(some_list, cmp=cmp_ignore_case)
但是,使用cmp
的效率低于key
,因此{2}已在Python 2中弃用了cmp
一段时间从Python 3中删除。
key
函数仅对您要排序的列表(或其他可迭代)中的每个唯一项目调用一次。相反,每次在两个项目之间进行比较时,都必须调用cmp
函数。
可以使用functools.cmp_to_key
将cmp
函数转换为key
函数,但这只是为了方便起见:它不能防止效率低下,它只隐藏它。因此,它只应用作使用cmp
的旧代码的临时修复,或者在极少数情况下无法使用key
函数。
有关详细信息,请参阅Sorting HOW TO。
答案 1 :(得分:2)
在您展示的文档中它是正确的:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.upper)
['about', 'bob', 'Credit', 'Zoo']
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
key
函数应该只接受一个参数:sorted
自动为每个字符串调用它。您的函数需要2个参数,而sorted
并不知道s2
应该是什么。
所以你的代码应该是:
def ignore_case(just_one_string):
return just_one_string.upper()
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=ignore_case))
# ['about', 'bob', 'Credit', 'Zoo']
混淆可能来自其他语言(例如Java)的快速,该方法需要2个参数(参见Comparator
)
答案 2 :(得分:2)
为了使用Python 3 sorted
的自定义比较器函数,您必须使用functools.cmp_to_key
,如下所示:
from functools import cmp_to_key
sorted(['bob', 'about', 'Zoo', 'Credit'], key=cmp_to_key(cmp_ignore_case))
有关详细信息,请参阅functools.cmp_to_key
:https://docs.python.org/3/library/functools.html#functools.cmp_to_key