如何修复鸡尾酒排序(Cocktail Sort)代码中的TypeError错误
修复鸡尾酒排序代码的TypeError问题
错误原因
你代码里的核心问题是把内置类型list当成了传入的列表变量来使用。函数参数定义的是seq: list,但你在循环里写了len(list)、list[j],这里的list是Python的列表类型本身,不是你传入的具体列表实例,所以调用len(list)会抛出TypeError——类型对象没有len()方法。
另外还有一个逻辑错误:第二个for循环里的if not swapped: return list位置不对,应该放在两轮遍历(从右到左、从左到右)都完成之后,否则第一次内层循环没交换就提前返回,会导致排序不完整。
修复后的代码
def cocktail_sort(seq: list): # 用参数seq代替内置类型list,获取传入列表的长度 for i in range(len(seq) - 1, 0, -1): swapped = False # 从右往左遍历,把最小元素移到左侧 for j in range(i, 0, -1): if seq[j] < seq[j-1]: # 用Python的交换语法简化代码,不需要临时变量 seq[j], seq[j-1] = seq[j-1], seq[j] swapped = True # 从左往右遍历,把最大元素移到右侧 for j in range(i): if seq[j] > seq[j+1]: seq[j], seq[j+1] = seq[j+1], seq[j] swapped = True # 两轮遍历后如果没有交换,说明列表已经有序,提前退出 if not swapped: return seq lst = [15, 4, 7, 2, 1, 20] print(cocktail_sort(lst))
关键修复点说明
- 所有
list的引用都替换成了函数参数seq,确保操作的是传入的具体列表 - 把
if not swapped的判断移到了两轮遍历的外面,保证每一轮完整的左右遍历后再检查是否有序 - 用Python的元组交换语法
a, b = b, a替代了临时变量,让代码更简洁易读 - 增加了注释说明每一步的作用,方便理解鸡尾酒排序的双向遍历逻辑
运行修复后的代码,会输出正确的排序结果:[1, 2, 4, 7, 15, 20]
内容的提问来源于stack exchange,提问作者MrSovyasha
相关产品推荐
相关产品推荐

