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
相关产品推荐
相关产品推荐

