Python中按最后子列表排序同步调整所有子列表对应索引
解决方案
核心思路是先确定最后一个子列表升序排序后的索引顺序,再用这个索引顺序重新排列所有子列表的元素。
步骤分解
- 提取最后一个子列表,生成它的排序索引
- 遍历所有子列表,按排序索引重新提取元素
完整代码示例
original = [[6.0, 3.0, 16.0, 3.0], [3.0, 2.0, 5.0, 7.0], [4.0, 3.0, 2.0, 1.0]] # 获取最后一个子列表的排序索引:按元素值升序,记录对应的原始索引 last_sub = original[-1] sorted_indices = sorted(range(len(last_sub)), key=lambda i: last_sub[i]) # 按索引重新排列每个子列表 result = [[sub[i] for i in sorted_indices] for sub in original] print(result) # 输出:[[3.0, 16.0, 3.0, 6.0], [7.0, 5.0, 2.0, 3.0], [1.0, 2.0, 3.0, 4.0]]
关键细节说明
sorted(range(len(last_sub)), key=lambda i: last_sub[i]):这行代码生成的是原始索引的排序结果,排序依据是对应位置的元素值。比如原最后子列表[4.0,3.0,2.0,1.0],排序后元素顺序是1.0,2.0,3.0,4.0,对应的原始索引就是3,2,1,0。- 列表推导式
[[sub[i] for i in sorted_indices] for sub in original]:遍历每个子列表,按排序后的索引依次取出元素,实现所有子列表的同步重排。
为什么直接用zip可能没成功?
如果直接用zip(*original)转置后排序,会把每一列作为整体排序,这和需求不符——我们需要的是基于最后一列的排序结果,调整所有列的顺序,而不是对列本身排序。上面的方法精准抓住了“索引顺序”这个核心,就能实现预期效果。
内容的提问来源于stack exchange,提问作者SomewhereGalaxy
相关产品推荐
相关产品推荐

