Python “functools.cmp_to_key”不是&x27;t正在研究两元组问题的比较
对于Python “functools.cmp_to_key”不是&x27;t正在研究两元组问题的比较,python,functools,Python,Functools,对于cmp\u to_键(fn),我在文档中读到fn(a,b)应该返回-1如果a应该在b之前,并且0相等,并且1如果a应该在b之后 我有这个输入 smith 20 jones 15 jones 20 我把它存储为元组,所以我的比较器是,我想按分数排序(第2列),按降序排序,按名称排序(第1列),按升序排序 但我得到的是这个 jones 20 jones 15 smith 20 这是不正确的。我哪里不理解cmp\u to_键函数?您的问题是当b[1]小于a[1]时,比较器函数不会给出正确的结果
cmp\u to_键(fn)
,我在文档中读到fn(a,b)
应该返回-1
如果a
应该在b
之前,并且0
相等,并且1
如果a
应该在b
之后
我有这个输入
smith 20
jones 15
jones 20
我把它存储为元组,所以我的比较器是,我想按分数排序(第2列),按降序排序,按名称排序(第1列),按升序排序
但我得到的是这个
jones 20
jones 15
smith 20
这是不正确的。我哪里不理解
cmp\u to_键
函数?您的问题是当b[1]
小于a[1]
时,比较器函数不会给出正确的结果;无论a[0]
和b[0]
的值是多少,它都应该返回1。您可以更简单地将其改写为:
def comparator(a, b):
if a[1] != b[1]:
return b[1] - a[1]
if a[0] != b[0]:
return -1 if a[0] < b[0] else 1
return 0
data = [['smith', 20],
['jones', 15],
['jones', 20]
]
print(sorted(data, key=cmp_to_key(comparator)))
需要注意的是,您可以使用lambda函数,对score
值求反,以便它按降序排序:
print(sorted(data, key=lambda x:(-x[1], x[0])))
Python切换到键函数的要点是,直接编写键函数比使用比较器更清晰,更不容易出错
cmp_to_键
几乎完全作为Python 2到3转换辅助工具存在,而不是作为您应该在新代码中使用的东西。您的键可以是lambda x:(-x[1],x[0])
。
def comparator(a, b):
if a[1] != b[1]:
return b[1] - a[1]
if a[0] != b[0]:
return -1 if a[0] < b[0] else 1
return 0
data = [['smith', 20],
['jones', 15],
['jones', 20]
]
print(sorted(data, key=cmp_to_key(comparator)))
[
['jones', 20],
['smith', 20],
['jones', 15]
]
print(sorted(data, key=lambda x:(-x[1], x[0])))