Python3.5中嵌套列表按自定义函数二次排序失败求助
问题分析与解决方案
嘿,我来帮你排查下问题所在~
你的代码核心问题出在sort的key参数里:你写的是lambda x: (x[0], cs),这里的cs是函数对象本身,而不是调用函数后得到的返回值。这就导致两个问题:
- 函数
cs根本不会被执行(所以你加的打印语句没输出),因为你只是把函数对象作为排序键的一部分,没有触发它的调用; - 所有元素的第二个排序键都是同一个函数对象,比较函数对象时只会看内存地址,完全起不到你想要的自定义二次排序效果。
修正后的代码
只需要把cs改成cs(x),让lambda每次处理元素时都调用cs函数并传入当前元素即可:
lst = [[1, 'A', 2], [2, 'C', 3], [2, 'A', 4], [2, 'B', 5], [3, 'D', 6]] def cs(item): # 添加打印语句验证函数执行情况 print(f"正在处理元素: {item}") if item[1] == 'A': return 1 if item[1] == 'B': return 2 return 3 # 修正key参数,调用cs(x)而不是直接传cs lst.sort(key=lambda x: (x[0], cs(x))) print(lst)
执行后你会看到打印输出,最终排序结果就是你预期的:[[1, 'A', 2], [2, 'A', 4], [2, 'B', 5], [2, 'C', 3], [3, 'D', 6]]
可选优化方案
如果你的自定义排序规则只是简单的映射关系,也可以用字典来简化代码,不用单独定义函数:
lst = [[1, 'A', 2], [2, 'C', 3], [2, 'A', 4], [2, 'B', 5], [3, 'D', 6]] # 定义字符到排序权重的映射,未在字典中的字符默认返回3 sort_weight = {'A': 1, 'B': 2} lst.sort(key=lambda x: (x[0], sort_weight.get(x[1], 3))) print(lst)
这个写法更紧凑,效果和之前的函数完全一致。
内容的提问来源于stack exchange,提问作者user2194805
相关产品推荐
相关产品推荐

