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

选择排序排序指定列(索引3)时触发TypeError问题排查

问题排查与修正:选择排序按指定列排序触发TypeError

先直接说清楚你报错的核心原因:你在代码里把循环变量i(这是一个整数,用来标记当前迭代的位置)当成了列表去做下标访问i[3],整数类型根本不支持这种操作,这就是触发TypeError的直接原因。

结合你的需求——对列表中索引为3的列(应该是指二维列表里每个子列表的第3个元素)进行排序,我来逐一指出代码里的问题并修正:

原代码的关键错误点

  • min_idx = i[3]:i是range(size)生成的整数,不是列表,不能用[3]取元素。你要做的是初始化min_idx为当前的迭代索引i,后续通过比较子列表的第3个元素来更新它。
  • if lst2[j] < lst2[min_idx]:这里比较的是整个子列表,而不是你想要的第3列元素,应该改成if lst2[j][3] < lst2[min_idx][3]。
  • lst2[i[3]], lst2[min_idx] = ...:同样错误地把整数i当成列表访问,你需要交换的是整个子列表,也就是lst2[i]和lst2[min_idx]。

修正后的代码

def selectionSort(lst2):
    size = len(lst2)
    for i in range(size):
        # 初始化当前最小值的索引为当前迭代的i
        min_idx = i
        # 从i+1开始遍历找更小的(按第3列元素比较)
        for j in range(i + 1, size):
            # 比较子列表的第3个元素(索引3)
            if lst2[j][3] < lst2[min_idx][3]:
                min_idx = j
        # 交换当前位置i和最小值所在位置的子列表
        lst2[i], lst2[min_idx] = lst2[min_idx], lst2[i]

# 假设你的lst是二维列表,比如示例数据
lst = [
    [1, 2, 3, 5],
    [4, 5, 6, 2],
    [7, 8, 9, 7]
]
# 用深拷贝避免修改原列表(如果不需要可以直接传lst)
lst2 = [row.copy() for row in lst]
selectionSort(lst2)
print(lst2)

额外说明

  1. 我添加了示例的二维列表数据,方便你测试运行;
  2. 把lst2 = lst改成了[row.copy() for row in lst],这是浅拷贝子列表的方式,避免修改排序后的列表影响原列表lst(如果你的需求就是要修改原列表,可以直接传lst进去);
  3. 修正后的代码会按照每个子列表中索引为3的元素从小到大排序示例数据,最终输出会是:
[[4, 5, 6, 2], [1, 2, 3, 5], [7, 8, 9, 7]]

内容的提问来源于stack exchange,提问作者mo-abu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:57:33