Python sort lib 具有不同比较函数的不同行为,某些比较函数将不起作用

问题描述 投票:0回答:1

对于比较函数功能

from functools import cmp_to_key
def compare(a,b):
    print(a,b, a+b,b+a,a+b>b+a) 
    return (a+b)>(b+a) # first comparing function

def sortArr(ls):
    ls = sorted(ls,key =cmp_to_key(compare),reverse=True)
    return "".join(ls)

ls = ["8","81","82","829"]
print(sortArr(ls))

输出为:

82 829 82829 82982 False
81 82 8182 8281 False
8 81 881 818 True
88182829

但是使用比较函数为:

from functools import cmp_to_key
def compare(a,b):
    print(a,b, a+b,b+a,a+b>b+a)
    return int(a+b) -int(b+a) # second comparing function

def sortArr(ls):
    ls = sorted(ls,key =cmp_to_key(compare),reverse=True)
    return "".join(ls)

ls = ["8","81","82","829"]
print(sortArr(ls))

输出是

82 829 82829 82982 False
81 82 8182 8281 False
8 81 881 818 True
8 82 882 828 True
8 829 8829 8298 True
88298281

显然需要第二个排序功能。第一个函数没有使用第一个元素进行所有比较。

那么为什么第一个比较功能不起作用?

python string compare sortcomparefunction
1个回答
0
投票

目前还不清楚为什么你会期望第一个函数能够工作。旧式比较函数必须像这样工作:

  • cmp(x, y)
    为负当且仅当
    x < y
  • cmp(x, y)
    为 0 当且仅当
    x == y
  • cmp(x, y)
    严格为正 (
    > 0
    ) 当且仅当
    x > y

鉴于此,您的

return (a+b)>(b+a)
似乎没有意义。它只能返回
True
False
,分别相当于 1 和 0。所以它不可能返回一个被解释为
a
小于
b
的结果。

© www.soinside.com 2019 - 2024. All rights reserved.