簡體   English   中英

為什么下面的代碼返回一個空列表。我不明白它的原因,所以如果有人可以幫助我,那會讓我高興

[英]Why is the code below return an empty list.I could not understand the reason of it so if someone can help me about that , that will make me happy

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 中獲取列表的異常值,但每次我嘗試它時,它都會返回一個空列表或引發錯誤,但我不想要這些,所以如果你能夠解決我的問題並解決,那將讓我開心。感謝閱讀如果您需要更多信息來解決問題,您可以詢問。

如果列表返回空,原因是您的if條件的任何部分都不滿足,因此列表中沒有附加任何內容:

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

為什么呢? 那么 - q1q3在這里計算:

 q1 = median(list(range(fmin(args),floor(median(args))+1))) q3 = median(list(range(floor(median(args)),fmax(args)+1)))

並且兩者都是range s 轉換為list s,填充到您的median function 中,它也返回list s。

  • 您認為q3-q1 (list - list) 的結果是什么?
  • 你認為1.5*(q3-q1)*(q3-q1) (list-list 平方的 1.5 倍)的結果應該是多少?

如果您不反對使用更大的模塊,您可以使用 numpy 計算四分位數,請參閱

或使用此答案為您提供 function 進行手動計算:


順便提一句:

  • 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM