You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:38