Python list.sort()无法按预期工作

时间:2019-07-17 17:30:33

标签: python

传递给sort函数的compare函数似乎正常工作,但是最终数组未正确排序。

from functools import cmp_to_key

def cmp(t1, t2):                                                                                                                                                                                                                                                                                                                   
    print(t1)
    print(t2)                                                                                                                                                                                                                                                                                                                      
    if t1[0] < t2[0]:
        print("Returning True")                                                                                                                                                                                                                                                                                                        
        return True
    if t1[0] == t2[0]:
        print(t1[1])                                                                                                                                                                                                                                                                                                                   
        print(t2[1])
        print("Returning: " + str(t1[1] > t2[1]))                                                                                                                                                                                                                                                                                      
        return t1[1] > t2[1]
    print("Returning False")                                                                                                                                                                                                                                                                                                       
    return False

a = [(1, 'coding'), (2, 'i'), (2, 'love')]
a.sort(key=cmp_to_key(cmp))
print(a)

生成以下输出:

(2, 'i')
(1, 'coding')
Returning False
(2, 'love')
(2, 'i')
love
i
Returning: True
[(1, 'coding'), (2, 'i'), (2, 'love')]

因此,当将(2,'love')与(2,'i')进行比较时,compare函数返回True,这意味着(2,'love')应该在(2,'i')之前。但这不是最终数组中发生的事情。有任何线索吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的方法中的问题在注释中得到了解释,因此我将补充一点,即可以用更短的时间来实现:

a = [(1, 'coding'), (2, 'i'), (2, 'love')]
a.sort(key=lambda t: (-t[0], t[1]), reverse=True)
# same as a.sort(key=lambda t: (t[0], -t[1])) but - can't be used when comparing strings
print(a)
# [(1, 'coding'), (2, 'love'), (2, 'i')]