我试图从列表中删除一个项目,如果它超出了中间值的四分位数范围。
以下是清单:
l = [69, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 87, 89]与import numpy as np一起使用的是IQR、中间值和中值以上及以下。
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当我打印这个列表时,它仍然显示87,89。
发布于 2014-12-11 21:29:11
for ele in l[:]:
if ele < minus or ele > plus:
l.remove(ele)您必须复制l l[:]并使用l.remove修改实际列表本身。
发布于 2014-12-11 21:30:59
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)]发布于 2014-12-11 21:32:13
只需将其转换为numpy数组,然后再从该数组中计算:
l = np.array(l)
l[(l >= 69) & (l <= 71)]就这样。
https://stackoverflow.com/questions/27432627
复制相似问题