选择排序排序指定列(索引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)
额外说明
- 我添加了示例的二维列表数据,方便你测试运行;
- 把
lst2 = lst改成了[row.copy() for row in lst],这是浅拷贝子列表的方式,避免修改排序后的列表影响原列表lst(如果你的需求就是要修改原列表,可以直接传lst进去); - 修正后的代码会按照每个子列表中索引为3的元素从小到大排序示例数据,最终输出会是:
[[4, 5, 6, 2], [1, 2, 3, 5], [7, 8, 9, 7]]
内容的提问来源于stack exchange,提问作者mo-abu
相关产品推荐
相关产品推荐

