为何调换Python列表sort方法调用顺序可满足排序要求?
两次sort调用顺序影响结果的原因
问题背景
需要实现sort_index函数,满足:
- 接收嵌套列表作为输入
- 按内部列表的第三个元素降序排列外层列表
- 排序出现平局时按内部列表第一个元素升序排列
- 原地修改输入列表
初始错误代码:
def sort_index(some_list): some_list.sort(key=lambda x: x[2], reverse=True) some_list.sort(key=lambda x: x[0])
修改后正确代码:
def sort_index(some_list): some_list.sort(key=lambda x: x[0]) some_list.sort(key=lambda x: x[2], reverse=True)
原因解析
核心在于Python的list.sort()是稳定排序:当两个元素的排序key值相同时,它们的相对位置会保留上一次排序后的结果。
你的需求优先级是:
- 主要条件:按内部列表第三个元素(x[2])降序
- 次要条件:当x[2]相同时,按内部列表第一个元素(x[0])升序
所以正确的逻辑是先处理次要条件,再处理主要条件:
- 第一步按x[0]升序排序:此时所有元素已按第一个元素排好序,x[0]相同的元素会保持相邻且有序。
- 第二步按x[2]降序排序:当两个元素的x[2]值相同时,稳定排序会保留它们之前按x[0]排好的相对位置,刚好满足“平局时按x[0]升序”的要求。
而你最初的顺序是先排主要条件再排次要条件:
- 第一步按x[2]降序排好后,第二步按x[0]升序排序会直接覆盖之前的排序结果——不管x[2]的值,完全按x[0]重新排序,这就破坏了原本按x[2]降序的核心要求,自然通不过测试。
更简洁的写法
其实可以用复合key一次完成排序,效率更高:
def sort_index(some_list): some_list.sort(key=lambda x: (-x[2], x[0]))
这里用-x[2]把降序需求转化为默认的升序排序(原数降序等价于负数升序),然后用x[0]作为次要排序条件,一次调用sort就能满足所有要求。
内容的提问来源于stack exchange,提问作者lyapore
相关产品推荐
相关产品推荐

