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])))