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

如何无库实现按所有子列表对含任意子列表的列表排序并获取索引

自定义多维排序并获取索引(无内置/第三方库依赖)

针对任意数量子列表的多维列表,我们可以通过绑定原始索引+自定义排序逻辑来实现需求,完全不需要依赖Python内置sorted()或第三方库,具体实现步骤如下:

核心思路

  1. 绑定原始索引:将所有子列表对应位置的元素打包成元组,同时记录该元组的原始索引,确保排序过程中能跟踪元素的初始位置。
  2. 自定义多维排序:实现基础排序算法(比如冒泡、选择排序),排序时按元组的维度优先级依次比较,直到找到第一个不同的元素来决定排序顺序。
  3. 提取结果:排序完成后,分别提取原始索引序列和排序后的多维数据。

代码实现

def multi_dimensional_sort_with_indices(data):
    # 给每个位置的元素绑定原始索引
    indexed_elements = []
    elem_count = len(data[0])
    for idx in range(elem_count):
        # 收集当前索引在所有子列表中的值,打包成元组
        element_tuple = tuple(sub_list[idx] for sub_list in data)
        indexed_elements.append((element_tuple, idx))
    
    # 自定义冒泡排序(可替换为选择/插入排序,核心逻辑一致)
    n = len(indexed_elements)
    for i in range(n):
        swapped = False
        for j in range(n - i - 1):
            elem1, idx1 = indexed_elements[j]
            elem2, idx2 = indexed_elements[j + 1]
            
            # 按维度优先级依次比较,直到找到差异
            should_swap = False
            for val1, val2 in zip(elem1, elem2):
                if val1 > val2:
                    should_swap = True
                    break
                elif val1 < val2:
                    break
            
            if should_swap:
                indexed_elements[j], indexed_elements[j + 1] = indexed_elements[j + 1], indexed_elements[j]
                swapped = True
        if not swapped:
            break
    
    # 提取排序索引和排序后的多维数据
    sorted_indices = [idx for (elem, idx) in indexed_elements]
    sorted_data = []
    for dim in range(len(data)):
        sorted_dim = [elem[dim] for (elem, idx) in indexed_elements]
        sorted_data.append(sorted_dim)
    
    return sorted_data, sorted_indices

测试示例

# 测试用多维列表
data = [
    [3, 1, 4, 1, 5],
    [2, 7, 1, 8, 2]
]

sorted_result, sort_indices = multi_dimensional_sort_with_indices(data)
print("排序后的数据:", sorted_result)
print("排序索引:", sort_indices)

输出结果

排序后的数据: [[1, 1, 3, 4, 5], [7, 8, 2, 1, 2]]
排序索引: [1, 3, 0, 2, 4]

调整说明

  • 如果需要降序排序,只需将排序逻辑中的val1 > val2改为val1 < val2即可。
  • 该方法支持任意数量的子列表(要求所有子列表长度一致),无需修改核心逻辑。

内容的提问来源于stack exchange,提问作者bearyTheBear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:51:18