如果我想按此标准对非空字符串列表进行排序 -
"x + y > y + x"
(对于任何 x = lst[i]
、y = lst[j]
0 <= i < j < len(lst)
)
我知道一种方法是定义一个
my_key
类并将逻辑放在这个类中,然后执行sorted(key=my_key)
。另一种方法是使用 cmp_to_key
functool。
我想知道是否也可以在这里使用 lambda 表达式(没有
cmp_to_key
)?类似的东西-
sorted(lst, key = lambda x, y: ((x+y > y+x) - (x+y < y+x))
(由于缺少位置参数,上面的代码不起作用。)
(编辑:不简单地使用
x > y
的原因是例如"21" > "2"
而是"21" + "2" < "2" + "21"
)
比较函数不应像
lambda x, y: x+y > y+x
那样返回布尔值,而应返回负数(如果第一个操作数被认为小于第二个操作数),0
(如果相等)或正数(大于),如文档所述在functools.cmp_to_key
。
您可以按照here发布的解决方案创建一个比较函数,当
x
大于y
时,考虑x + y
小于y + x
,反之亦然:
from functools import cmp_to_key
lst = ['b', 'aa', 'bb', 'a']
print(sorted(lst,
key=cmp_to_key(lambda x, y: ((a := x + y) < (b := y + x)) - (a > b))))
输出:
['b', 'bb', 'aa', 'a']
如评论中所述,例如
'aa'
和 'a'
会被比较函数视为相等,在这种情况下,Python 的排序算法将在输出中保留其原始顺序。
另外,如评论中所述,您的比较函数不适用于空字符串,因为例如给定
['a', '', '0']
,如果算法选择 'a', ''
和 '', '0'
对进行比较,则 'a'
将是推断为等于 '0'
,但如果选择了一对 'a', '0'
,则会被视为不同,因此您应该确保您的用例不涉及空字符串。