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

插入排序代码在主函数与自定义函数中执行异常及报错排查

分析插入排序代码中的TypeError问题

这个报错的根源很明确:你在数组里混合存储了字符串和整数类型的元素,而str.join()方法要求传入的序列必须全是字符串类型,一旦遇到整数就会抛出TypeError。

问题出在哪?

咱们一步步拆解:

  • 主函数里,arr = input().rstrip().split()得到的是纯字符串列表,比如输入1 4 3 5 6 2后,arr是["1", "4", "3", "5", "6", "2"],这时候第一次打印' '.join(arr)完全没问题,因为都是字符串。
  • 但进入insertionSort2函数后,你做了small=int(arr[i])把字符串转成了整数,接着又执行arr[j+1]=small,把这个整数存回了数组。比如第一轮循环i=1时,small是整数4,因为int(arr[0])=1不大于4,所以arr[1]被赋值为整数4,此时数组变成["1", 4, "3", "5", "6", "2"]——既有字符串又有整数。这时候再调用' '.join(arr),Python就无法处理不同类型的拼接,直接抛出错误。

怎么解决?

有两种简单的修复思路,选哪种都可以:

思路1:全程保持数组为字符串类型

比较的时候临时转成整数判断大小,赋值时还是存字符串,确保数组元素类型统一:

def insertionSort2(n, arr):
    for i in range(1,n):
        small_str = arr[i]  # 保留字符串类型
        j = i - 1
        # 比较时转成int判断大小
        while j >= 0 and int(arr[j]) > int(small_str):
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = small_str  # 存回字符串
        print(' '.join(arr))
        # 原代码里的print('\r')没必要,print本身会自动换行

if __name__ == '__main__':
    n = int(input())
    arr = input().rstrip().split()
    print(' '.join(arr))
    insertionSort2(n, arr)

思路2:全程用整数数组,打印时转成字符串

一开始就把输入转成整数列表,打印的时候再统一转成字符串拼接:

def insertionSort2(n, arr):
    for i in range(1,n):
        small = arr[i]  # 直接用整数
        j = i - 1
        while j >= 0 and arr[j] > small:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = small
        # 打印时把每个整数转成字符串再join
        print(' '.join(map(str, arr)))

if __name__ == '__main__':
    n = int(input())
    # 把输入的字符串列表转成整数列表
    arr = list(map(int, input().rstrip().split()))
    print(' '.join(map(str, arr)))
    insertionSort2(n, arr)

总结

本质就是要保证数组元素类型统一——要么全是字符串,要么全是整数。混合类型会让依赖单一类型的方法(比如str.join())直接罢工。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:29:22