【问题标题】:Why does the code below return an empty list?为什么下面的代码返回一个空列表?
【发布时间】:2021-12-31 07:04:19
【问题描述】:
def outlier(*args):
    outlist=[]
    def median(args1):
        if(len(args1)%2==1):
            return list(sorted(args1))[int((len(args1)/2)-0.5)]
        else:
            return (list(sorted(args1))[int(len(args1)/2)]+list(sorted(args1))[int(len(args1)/2)-1])/2
    def fmax(args2):
        sortargs=sorted(args2)
        return sortargs[-1]
    def fmin(args3):
        sortargs=sorted(args3)
        return sortargs[0]
    q1=median(list(range(fmin(args),floor(median(args))+1)))
    q3=median(list(range(floor(median(args)),fmax(args)+1)))
    for i in args:
        if(i<(q1-1.5*(q3-q1)) or i>(q3+1.5*(q3-q1)*(q3-q1))):
            outlist.append(i)
    return outlist

print(outlier(1,2,3,4,5,6,7,8,9,10,100000000))

我曾尝试在 Python 中获取列表的异常值,但每次尝试时,它都会返回一个空列表或引发错误。

【问题讨论】:

  • 请注意,Python 提供了一个min 和一个max 函数,它们比对列表进行排序并获取第一个或最后一个值要高效得多。此外,您应该避免使用嵌套函数调用填充的长行。一次做一件事,如果出现问题,检查(简单地打印)中间变量的值会容易得多。

标签: python list


【解决方案1】:

如果列表返回空,原因是您的if 条件的任何部分都不满足,因此列表中没有附加任何内容:

if(i<(q1-1.5*(q3-q1)) or i>(q3+1.5*(q3-q1)*(q3-q1))):   # never met

如果您不反对使用更大的模块,您可以使用 numpy 计算四分位数,请参阅

或使用this answer that gives you a function for manual计算:


顺便说一句:

  • sorted() 返回一个列表,所以 list(sorted(..)) 是多余的
  • 虽然较小的函数很好,但多次排序相同的数据效率不高 - 排序一次 - 获取列表使用的最小值/最大值:
  • 您的所有计算都需要排序输入 - 您也可以将其排序一次,然后将排序后的列表用作更下方的输入

您还可以在一次排序中获得最小值和最大值:

def minmax(data):
    if len(data) < 2: 
        raise ValueError("Must be iterable of len 2 or more")
    srt = sorted(data)

    return srt[0], srt[-1]

而不是

def fmax(args2):
    sortargs=sorted(args2)
    return sortargs[-1]
def fmin(args3):
    sortargs=sorted(args3)
    return sortargs[0]

【讨论】:

  • 感谢您的帮助,但我想在没有库的情况下做到这一点。如果我想通过使用库来解决我自己的问题,Pandas data.describe() 中提供了两者四分位数。如果我想通过使用库来做到这一点,我可以使用它,但这并不意味着你没有帮助我;相反,你通过让我知道我没有的 pandas 的一些新属性对我帮助很大直到我阅读您对我提出的问题的答案时才知道。我可以接受数据科学的新人,我是 3 个月前开始的,所以你可以理解为什么我不知道这些方法。
  • 我看到我的中值函数不返回列表,它返回 int 或 float。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 2018-02-26
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多