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

数组元素按约数数量筛选实现及list index out of range报错解决方案

报错原因

你最初的for i in array是Python的直接迭代元素写法,这里的i本身就是数组中的元素值,不是数组下标索引。你强行替换为array[i]后,相当于把元素值当作下标去读取数组内容,只要元素值大于等于数组长度,就会触发list index out of range越界错误。
而且你原本的写法已经是直接用数组元素做除法校验了,完全符合你的优化需求,不需要额外修改。

代码优化建议

你原来的代码还有两个隐藏问题,可能就是测试工具报错的原因:

  • 没有处理0的特殊情况:数学上0可以被所有非0整数整除,原本的逻辑中div <= i在i=0时永远不成立,会统计到0个除数,直接加入结果数组,你可以根据自己的需求调整0的判断逻辑
  • 变量命名容易混淆:把迭代变量名从i改成num,可以彻底避免和索引混淆
  • 没有兼容负数场景:如果输入数组包含负数,需要先取绝对值再统计除数

优化后直接迭代元素的版本(推荐)

def filter_array(array):
    sub_array = []
    for num in array:
        n = 0
        div = 1
        # 如果你认为0符合<5个除数的条件,保留这两行,否则调整逻辑
        if num == 0:
            sub_array.append(num)
            continue
        # 处理负数情况,取绝对值统计除数
        abs_num = abs(num)
        while n <= 4 and div <= abs_num:
            if abs_num % div == 0:
                n += 1
            div += 1
        if n <= 4:
            sub_array.append(num)
    return sub_array

如果你确实需要用索引遍历的版本

只有当for循环遍历的是数组下标范围时,才能用array[i]读取元素,写法如下:

def filter_array(array):
    sub_array = []
    # 遍历下标范围,此时i才是索引
    for i in range(len(array)):
        num = array[i]
        n = 0
        div = 1
        if num == 0:
            sub_array.append(num)
            continue
        abs_num = abs(num)
        while n <= 4 and div <= abs_num:
            if abs_num % div == 0:
                n += 1
            div += 1
        if n <= 4:
            sub_array.append(num)
    return sub_array

内容的提问来源于stack exchange,提问作者some python noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:24:03