为何两种sort用法在按列表第二元素排序时会出现不同结果
两种排序合并写法的差异原因
两种写法的执行逻辑存在本质差异,小样本测试结果一致仅为巧合,大规模数据下结果不同是必然现象。
两种写法的逻辑区别
写法1逻辑错误,破坏原始配对关系
写法1先对end列表执行原地排序,这一步直接打乱了end中元素和对应位置start元素的原始配对关系,后续合并只是将原顺序的start元素,和排序后的end元素按位置强行拼接,得到的[start[x], end[x]]完全不是原始的配对组合。
示例代码:
end.sort() for x in range(n): tmp.append([start[x],end[x]])
写法2逻辑正确,保留原始配对关系
写法2先将相同位置的start[x]和end[x]绑定为一个子列表,保证原始配对关系不会丢失,再统一按子列表的第二个元素排序,排序过程中每个子列表的两个元素始终是一一对应的。
示例代码:
for x in range(n): tmp.append([start[x],end[x]]) tmp.sort(key=lambda x:x[1])
小样本测试结果一致的原因
你给出的测试用例中,原始end数组[2,4,6,7,9,9]本身就是天然升序排列的,调用end.sort()没有改变end数组的元素顺序,所以两种写法的结果刚好重合,属于特殊情况,不具备通用性。
差异验证反例
我们用一组简单的非升序end数组测试即可看到明显差异:
输入:
start = [3,1] end = [4,2]
写法1输出:
[[3, 2], [1, 4]]
写法2输出:
[[1, 2], [3, 4]]
可以看到两种写法的结果完全不同,核心原因就是写法1破坏了原始的配对关系。
内容的提问来源于stack exchange,提问作者Pratyush Arora
相关产品推荐
相关产品推荐

