编写数组元素存在性检查函数时遇TypeError错误求助
解决TypeError: 'int' object is not subscriptable错误及代码修复
错误根源梳理
- 函数传参错误:在
remplir函数中调用exist(t[i])时,传入的t[i]是单个整数,但exist函数定义要求接收数组和长度参数,导致函数内部误将整数当作数组进行下标访问,触发报错。 - exist函数逻辑偏离需求:原函数是检查数组内是否存在重复元素,但实际需要的是验证新输入的数字是否已存在于数组的已填充部分。
- 数组初始化错误:
t=array([int]*10)创建的是包含10个int类型对象的数组,而非数值型数组,后续赋值会引发类型冲突。 - 希尔排序逻辑错误:
shell函数中range(t)是无效写法(t是数组而非整数),且步长计算、循环范围均不符合希尔排序的正确逻辑。
分步修复方案
- 重构exist函数:重新定义函数,接收数组、已填充元素数量、待检查数字三个参数,遍历已填充部分判断重复。
- 修正函数调用:在
remplir中调用exist时,传入完整数组、当前已填充长度、新输入的数字,而非单个元素。 - 正确初始化数组:用
t=array([0]*10)创建初始值为0的整数数组,避免类型问题。 - 修复希尔排序:调整步长计算方式和循环范围,实现正确的希尔排序逻辑。
完整修正代码
from numpy import* # 初始化10个0的整数数组 t = array([0]*10) # 获取5-10之间的数组长度 def taille(): n = int(input("请输入数组长度: ")) while n < 5 or n > 10: n = int(input("请输入5到10之间的长度: ")) return n # 检查数字是否存在于数组前k个元素中 def exist(arr, k, num): for i in range(k): if arr[i] == num: return True return False # 填充数组,确保元素不重复 def remplir(t, n): t[0] = int(input("请输入t[0]: ")) for i in range(1, n): num = int(input("请输入元素: ")) while exist(t, i, num): num = int(input("请输入不重复的元素!: ")) t[i] = num # 希尔排序实现 def shell(t, n): # 计算初始步长 gap = 1 while gap < n // 3: gap = gap * 3 + 1 # 逐步缩小步长排序 while gap >= 1: for i in range(gap, n): key = t[i] j = i - gap while j >= 0 and t[j] > key: t[j + gap] = t[j] j -= gap t[j + gap] = key gap = gap // 3 # 打印数组元素 def affichage(t, n): for i in range(n): print(t[i]) n = taille() remplir(t, n) shell(t, n) affichage(t, n)
核心优化说明
- 修正后的
exist函数逻辑更精准,仅遍历已填充部分检查重复,避免冗余计算。 - 数组初始化改为数值类型,彻底解决类型不匹配问题。
- 希尔排序修复后可正常完成数组排序功能。
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

