2016-12-17 32 views
0

如何更改下面的代碼,以便當找到一個負數時跳過它(例如-1)並返回僅爲正數的平均值? (例如0及以上)如何在python中修改平均函數?

def Avg(B): 
    sum = 0 
    for b in B: 
     sum = sum + b 
    return sum/len(B) 
+1

如果b <0:跳過它。只需添加驗證; –

回答

2

只要檢查B中的b是否定的,如果它是跳過它。最後,你需要記住你跳過多少個數來計算正確的平均值。我使用了稱爲底片的整數變量。

def Avg(B): 
    sum = 0 
    negatives = 0 
    for b in B: 
     if b >= 0: 
      sum = sum + b 
     else: 
      negatives += 1 
    return sum/(len(B)-negatives) 

或者你可以指望的陽性(它避免了多餘的調用Len和更直接地表達了「平均」 - 的東西的總和除以它們的數量平均爲感謝@pvg):

def Avg(B): 
    sum = 0 
    positives = 0 
    for b in B: 
     if b >= 0: 
      sum = sum + b 
      positives += 1 
    return sum/positives 

無論如何,你應該使用另一個名字作爲總和,這樣你就不會影響標準庫的sum函數。

+0

請添加一些關於您所做更改的說明! –

+0

你最好只計算積極因素。它更直接,更清晰。 – pvg

+1

@kiner_shah我正要這樣做 –

2

首先,不要使用sum作爲名稱,它會掩蓋內置的sum函數。

其次,如果你只需要陽性,過濾你的初始列表B列表中的理解,然後遍歷它:

def Avg(B): 
    mysum = 0 
    pos = [i for i in B if i>0] 
    for i in pos: 
     mysum += i 
    return mysum/len(pos) 

使用內置sum,你當然可以,縮短這:

def Avg(B): 
    pos = [i for i in B if i>0] 
    return sum(pos)/len(pos) 
+1

這創建了一個額外的列表,沒有特別的原因,並遍歷數據近兩次。 – pvg

+0

@pvg是的,它的確如此。我認爲它比保持反抗力量要乾淨,以便除以總結的元素數量。 –

+0

@pvg Nope,第二種方法更快(第一種方法僅適用於OP方便),因爲list-comp已針對列表的快速創建進行了優化,而'sum'則以'C'速度完成任務。缺點是增加的列表創建,我同意。 –

0
def Avg(B): 
    sum = 0 
    count = 0 
    for b in B: 
     if b < 0: 
      continue 
     sum += b 
     count += 1 
    return sum/count