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

Python二维数组按指定列排序异常:IMDb数据集startYear排序失效

排序算法未按指定列排序的问题修复

我正在开发Python函数,使用多种排序算法对IMDb数据集按测试用例指定的列排序(如测试用例1需按startYear列排序),但运行首个测试后发现排序算法未按startYear排序,反而按movieId(tconst)排序,导致测试失败。以下是相关代码及测试结果:


核心排序函数

def sorting_algorithms(file_path, columns, select):
    df = pd.read_csv(file_path)
    column_vals = [0] + [df.columns.get_loc(col) for col in columns]
    # Convert the dataframe to a 2D array of values
    data = df.iloc[:, column_vals].values.tolist()
    
    if(select==1):
        start_time = time.time()
        output_list = insertion_sort(data, column_vals)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]
    if(select==2):
        start_time = time.time()
        output_list = selection_sort(data, column_vals)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]
    if(select==3):
        start_time = time.time()
        output_list = quicksort(data, column_vals)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]
    if(select==4):
        start_time = time.time()
        output_list = heap_sort(data, column_vals)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]
    if(select==5):
        start_time = time.time()
        output_list = shell_sort(data, column_vals)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]
    if(select==6):
        start_time = time.time()
        output_list = merge_sort(data, column_vals)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]

selection_sort排序算法

def selection_sort(arr, columns):
    for i in range(len(arr)):
        min_idx = i
        for j in range(i+1, len(arr)):
            for col in columns:
                if arr[j][col] < arr[min_idx][col]:
                    min_idx = j
                    break
                elif arr[j][col] > arr[min_idx][col]:
                    break
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

测试函数

def testcase_1_1():
    global total
    global f
    sorted_testcase_1_1 = sorting_algorithms("testcases_1_2_df.csv", ['startYear'], 2)
    print("Sorted list of movie IDs for test case 1_1: ", sorted_testcase_1_1[1])

    df = pd.read_csv('imdb_dataset.csv', low_memory=False, delimiter=',')
    df = df[df['tconst'].isin(sorted_testcase_1_1[1])].set_index('tconst').loc[sorted_testcase_1_1[1]].reset_index()

    print("Sorted 2D array based on startYear column:\n", df[['tconst', 'startYear']].values)

    prev_start_year = None
    for index, row in df.iterrows():
        start_year = int(row['startYear'])
        print("prev_start_year: {}, start_year: {}".format(prev_start_year, start_year))
        if prev_start_year and start_year < prev_start_year:
            print("TestCase 1_1 failed")
            f += 1
            return 0
        prev_start_year = start_year

    print("TestCase 1_1 Passed and your Algorithm Time Complexity = {}".format(sorted_testcase_1_1[0]))
    total += 1
    return sorted_testcase_1_1

测试失败输出

prev_start_year: None, start_year: 2020
prev_start_year: 2020, start_year: 2015
TestCase 1_1 failed

问题原因

核心bug出在column_vals的构造逻辑:

column_vals = [0] + [df.columns.get_loc(col) for col in columns]

你把**第0列(tconst列)**加到了排序依据的列列表最前面,导致排序算法优先比较tconst列。由于数据中tconst是唯一值,排序逻辑完全变成按tconst排序,完全忽略了指定的startYear列。

修复方案

1. 修改核心排序函数

将排序用的列索引和返回用的tconst列分离,确保排序时只使用指定列:

def sorting_algorithms(file_path, columns, select):
    df = pd.read_csv(file_path)
    # 获取指定排序列在原DataFrame中的索引
    sort_col_indices = [df.columns.get_loc(col) for col in columns]
    # 提取包含tconst(第0列)和排序列的数据
    data = df.iloc[:, [0] + sort_col_indices].values.tolist()
    # 构造排序用的相对索引:数据列表中排序列的位置是1、2...(第0位是tconst)
    sort_rel_indices = list(range(1, len(sort_col_indices)+1))
    
    if(select==1):
        start_time = time.time()
        output_list = insertion_sort(data, sort_rel_indices)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]
    if(select==2):
        start_time = time.time()
        output_list = selection_sort(data, sort_rel_indices)
        end_time = time.time()
        time_in_seconds = end_time - start_time
        return [time_in_seconds, list(map(lambda x: x[0], output_list))]
    # 其他排序算法分支同理替换传入的sort_rel_indices

2. 验证排序逻辑

修改后,selection_sort会优先比较数据列表中的第1列(对应原DataFrame的startYear),只有当startYear相等时才会继续比较后续指定列,完全符合测试要求。

可选:用Pandas内置排序做对照

如果需要快速验证测试逻辑是否正确,可以先用Pandas内置排序实现一个基准版本:

def sorting_algorithms(file_path, columns, select):
    df = pd.read_csv(file_path)
    start_time = time.time()
    sorted_df = df.sort_values(by=columns).reset_index(drop=True)
    end_time = time.time()
    return [end_time - start_time, sorted_df['tconst'].tolist()]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:42:01