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

Python列表移除所有异常值失败:仅删首个异常值问题排查

问题分析与解决方案

嘿,这个问题我之前也碰到过,核心原因是你在遍历列表的同时直接修改了原列表,导致遍历的索引错位,所以第二个异常值200000根本没被检查到。

举个具体的例子:
原列表的元素顺序是 [25000, 30000, 52000, 28000, 150000, 190000, 200000],当循环到190000时,你把它从列表里删掉了,这时候列表变成[25000, 30000, 52000, 28000, 150000, 200000],原来200000的索引是6,现在变成了5,但循环的下一个索引会跳到6,这时候已经超出了列表的长度(现在列表只有6个元素,最大索引是5),所以200000直接被跳过了,没被判断是否是异常值。

下面给你两种解决方法:

方法一:遍历列表的副本,修改原列表

这种方法是遍历原列表的拷贝,这样修改原列表不会影响遍历的过程:

import statistics
dataset = [25000, 30000, 52000, 28000, 150000, 190000, 200000]
def detect_outlier(data_1):
    threshold = 1
    mean_1 = statistics.mean(data_1)
    std_1 = statistics.stdev(data_1)
    # 遍历原列表的副本,避免修改原列表干扰遍历
    for y in data_1.copy():
        z_score = (y - mean_1)/std_1
        print(z_score)
        if abs(z_score) > threshold:
            data_1.remove(y)
    return data_1
dataset = detect_outlier(dataset)
print(dataset)

方法二:创建新列表存储非异常值(更推荐)

这种方式不修改原始列表,而是新建一个列表来存放符合条件的元素,逻辑更清晰,也彻底避免了索引混乱的问题:

import statistics
dataset = [25000, 30000, 52000, 28000, 150000, 190000, 200000]
def detect_outlier(data_1):
    threshold = 1
    mean_1 = statistics.mean(data_1)
    std_1 = statistics.stdev(data_1)
    filtered_data = []
    for y in data_1:
        z_score = (y - mean_1)/std_1
        print(z_score)
        # 将非异常值加入新列表
        if abs(z_score) <= threshold:
            filtered_data.append(y)
    return filtered_data
dataset = detect_outlier(dataset)
print(dataset)

运行第二种方法后,输出会是[25000, 30000, 52000, 28000, 150000],两个异常值都被正确过滤掉了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:37:52