Python 如果在IQR之外,则删除列表中的项目

Python 如果在IQR之外,则删除列表中的项目,python,numpy,Python,Numpy,如果某个项目超出中位数的四分位范围,我将尝试从列表中删除该项目 名单如下: l = [69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 87, 89] IQR、中位数及中位数以上和中位数以下与import numpy一起用作np iqr = np.subtract(*np.percentile(l, [75, 25])) median = np.percentile(l, 50) minus = median - iqr plus = median

如果某个项目超出中位数的四分位范围,我将尝试从列表中删除该项目

名单如下:

l = [69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 87, 89]
IQR、中位数及中位数以上和中位数以下与
import numpy一起用作np

iqr = np.subtract(*np.percentile(l, [75, 25]))
median = np.percentile(l, 50)
minus = median - iqr
plus = median + iqr
负数是69,正数是71(使用高于和低于中位数的IQR)

但是,当遍历列表并尝试删除iqr上/下的项目(87、89)时。它们不会从列表中删除

for i in l:
    if i < minus:
        del i
    if i > plus:
        del i
对于l中的i:
如果i<负:
德利
如果i>plus:
德利
当我打印列表时,列表中仍然显示87、89。

对于l[:]中的元素:
for  ele in l[:]:
    if ele < minus or ele > plus:
        l.remove(ele)
如果ele<负或ele>正: l、 移除(ele)

您必须复制一份l
l[:]
,并使用
l对实际列表本身进行变异。remove

del
不是您要寻找的运算符。它用于删除对对象的引用,因此在垃圾收集中很有用

您可能正在寻找以下内容:

import numpy as np
l = [69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 87, 89]
iqr = np.subtract(*np.percentile(l, [75, 25]))
median = np.percentile(l, 50)
minus = median - iqr
plus = median + iqr

arr = np.array(l)
arr[ (minus < arr) & (arr < plus)]
将numpy导入为np
l=[69,70,70,70,70,70,70,70,70,71,71,71,87,89]
iqr=np.减去(*np.百分位数(l,[75,25]))
中位数=百分位数(l,50)
减=中值-iqr
加=中值+iqr
arr=np.数组(l)
arr[(减
只需将其转换为numpy数组,然后从中进行数学运算:

l = np.array(l)
l[(l >= 69) & (l <= 71)]
l=np.array(l)

l[(l>=69)和(l)您的循环没有对列表进行任何更改。虽然
i
从列表中弹出,但它没有绑定到列表。因此
deli
根本不触及
l
,我想您的意思是
l.pop(i)
索引器:pop索引超出范围。
这是
l.pop(i)的问题
@JonathanDavies,使用remove,但在删除元素时必须复制列表,不能迭代并从中删除元素object@PadraicCunningham格兰德,这很好用。谢谢你的帮助!不用担心,你很好。我想你把布尔逻辑弄糊涂了:现在你在选择智商之外的元素当然有!谢谢@OliverW。没问题。可能只是因为我们想到了相同的解决方案才注意到它。
del
不仅仅用于垃圾收集,也就是从
dict
中删除条目。它也可以用于从列表中删除条目。例如,
x=[“a”、“b”、“c”、“d”
,然后
del x[1]
给出了
[“a”、“c”、“d”]
@jme,有人指出这一点只是时间问题:-)在这两种情况下,我都会使用列表和dict的显式方法
pop
,因为它们都是为此而设计的。我在不同的场景中使用每种方法。如果我真的想删除条目,我会使用
del
。如果我想删除条目,但对值进行处理,我会使用
pop
方法。看到
pop
w由于某些原因,没有指定返回值会让我感到不舒服;
del
在这些情况下似乎更为惯用。另外
del
提供了一种简洁的方法来删除片段,如
del x[2:4]
,据我所知,这不能用列表或dict容器的方法来完成。@jme,一个好的用例,没有考虑到这一点!