2017-03-09 256 views
-2

忽略所有負面元素,並且僅使用正元素來計算平均值。計算並返回列表中只有正值的平均值

ave_pos([3, -3, 4, 0, 2, -1]) = 3 

這是我到目前爲止,我完全失去了爲什麼它不工作!

def ave_pos(nums): 
    avg = 0 
    for x in nums: 
     if x > 0: 
      avg = avg + x 
    return avg 
+1

在你的方法中你計算的總和不是平均值。 –

+0

你已經總結了所有的正數。總和不是平均值;您缺少除法步驟(也計算大於0的值的數量)。 –

回答

1

您可以使用列表理解將所有正數提取到另一個列表中。

def mean_positive(L): 
    # Get all positive numbers into another list 
    pos_only = [x for x in L if x > 0] 
    if pos_only: 
     return sum(pos_only)/len(pos_only) 
    raise ValueError('No postive numbers in input') 
0

多一點點,你的問題可以自己解決:你只需要通過積極因素的數量來劃分的總和:

​​
1

使用過濾器和總和是: -

a = [3, -3, 4, 0, 2, -1] 
apositive = filter(lambda x:x>0, a) 
sum(apositive)/len(apositive) 
+0

雖然Python 2中的工作正常,但在Python 3中,'filter'返回一個迭代器(一個'filter'對象),您無法調用'len'(也不會迭代多次)。如果你使用'list(filter(...))',你的代碼就可以工作,但列表理解可能更自然。 – Blckknght

+0

@Blckknght謝謝你,我在Python 2.7上工作,所以這個答案 –

0

公式計算平均是 total_sum/number_of_elements

使用計數變量來計算無陽性元素,並返回總和/計數

count =0; 
sum = 0 
for x in nums: 
    if x > 0: 
     sum = sum + x 
     count = count + 1 
return avg/count 
1

的問題是,你只是添加了所有的積極因素,而不是計算他們的平均。您的變量avg以所有積極因素的總和結束。要獲得平均值,您需要將總和除以有多少。下面是工作代碼的修改:

def ave_pos(nums): 
    total = 0 
    count = 0 
    for x in nums: 
     if x > 0: 
      total += x 
      count += 1 
    return float(total)/count 

正如你所看到的,它將保持運行總計並分別計數,並劃分出來底。如果你使用的是Python 2,那麼你需要調用float,否則該部分將舍入到下一個整數。在Python 3中,這不是必需的。