Python中如何用Lambda实现字符串列表的多条件排序?
解决字符串列表的多条件排序问题
错误原因分析
你遇到的问题是混淆了Python3中sort()/sorted()的key参数逻辑:
key参数需要的是接收单个元素、返回可用于比较的键值的函数,不是两两对比的逻辑;- 直接把双参数lambda传给
sorted()的第二个位置参数会报错,因为sorted()的位置参数只有第一个是待排序的可迭代对象。
两种可行解决方案
方案1:用元组作为排序键(推荐,简洁高效)
利用元组的顺序比较特性:先按字符串长度升序排序,长度相同时,按"A"出现次数的负数升序(等价于原次数降序)。代码如下:
# 使用sorted()返回新列表 result = sorted(result, key=lambda x: (len(x), -x.count("A"))) # 或者用list.sort()原地排序 result.sort(key=lambda x: (len(x), -x.count("A")))
原理:元组比较时会依次对比每个元素,长度小的优先;长度相同时,-x.count("A")越大(即原出现次数越多)的元素会排在前面。
方案2:用比较函数配合cmp_to_key(适合复杂排序逻辑)
如果需要更复杂的自定义比较逻辑,可以导入functools.cmp_to_key,把双参数的比较函数转换成key参数可接受的形式:
from functools import cmp_to_key def compare(x, y): # 先按长度升序:长度小的在前 if len(x) != len(y): return len(x) - len(y) # 长度相同时,按"A"出现次数降序:次数多的在前 else: return y.count("A") - x.count("A") # 使用sorted() result = sorted(result, key=cmp_to_key(compare)) # 或者原地排序 result.sort(key=cmp_to_key(compare))
原理:比较函数返回负数时,x排在y前面;返回正数时,y排在x前面;返回0则顺序不变。这里长度不同时,用len(x)-len(y)实现升序;长度相同时,用y.count("A")-x.count("A")让次数多的元素排在前面。
内容的提问来源于stack exchange,提问作者frost
相关产品推荐
相关产品推荐

