能否用Lambda表达式实现基于x+y>y+x规则的字符串列表排序?
能否直接用Lambda表达式实现基于
x + y > y + x规则的字符串列表排序? 不能直接用lambda作为key参数实现你要的排序逻辑。
原因很简单:Python的sorted()函数的key参数只接受单参数函数——它会为列表里的每个元素单独生成一个排序键,然后基于这些键的默认顺序来排序。但你的排序逻辑是双元素比较:需要同时拿两个元素x和y,比较x+y和y+x的大小,这种依赖两两元素互动的逻辑,没法通过单个元素的独立计算键来实现。
你尝试的lambda x, y: ...是双参数函数,而sorted()调用key函数时只会传一个元素,所以必然会报“缺少位置参数”的错误。
下面是你提到的两种可行方案的简洁实现示例:
方案1:用functools.cmp_to_key搭配lambda
from functools import cmp_to_key lst = ["21", "2", "12"] # 简洁写法:用布尔值转整数的方式生成比较结果 sorted_lst = sorted(lst, key=cmp_to_key(lambda x, y: (x+y > y+x) - (x+y < y+x))) print(sorted_lst) # 输出: ['2', '21', '12']
方案2:自定义key类
class SortKey: def __init__(self, s): self.s = s def __lt__(self, other): # 定义小于关系,sorted会自动基于这个规则排序 return self.s + other.s < other.s + self.s lst = ["21", "2", "12"] sorted_lst = sorted(lst, key=SortKey) print(sorted_lst) # 输出: ['2', '21', '12']
补充说明:之所以不能直接用字符串默认的字典序比较,是因为单个字符串的大小关系和拼接后的大小关系无直接对应——比如"21"字典序大于"2",但"21"+"2" = "212"小于"2"+"21" = "221",必须通过自定义两两比较逻辑才能得到正确顺序。
内容的提问来源于stack exchange,提问作者Egret
相关产品推荐
相关产品推荐

