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

编写数组元素存在性检查函数时遇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是数组而非整数),且步长计算、循环范围均不符合希尔排序的正确逻辑。

分步修复方案

  1. 重构exist函数:重新定义函数,接收数组、已填充元素数量、待检查数字三个参数,遍历已填充部分判断重复。
  2. 修正函数调用:在remplir中调用exist时,传入完整数组、当前已填充长度、新输入的数字,而非单个元素。
  3. 正确初始化数组:用t=array([0]*10)创建初始值为0的整数数组,避免类型问题。
  4. 修复希尔排序:调整步长计算方式和循环范围,实现正确的希尔排序逻辑。

完整修正代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:35:33