`排序(my_list,key = lambda x,y:...)`可能吗?

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

如果我想按此标准对非空字符串列表进行排序 -

"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"

python string sorting lambda key
1个回答
1
投票

比较函数不应像

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'
,则会被视为不同,因此您应该确保您的用例不涉及空字符串。

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