2012-01-19 81 views
0

['2598.95165','2541.220308','221068.0401','end','4834.581952','1056.394859','3010.609563','2421.437603','4619.861889','746.040504 '','268.3881793','379.3934898','1252.527752','11459.88522','4862.167506','506.924289','634.6737389','496.4679199','17941.59143','919.4998935','7247.610974','1166.053214' '47360.91508','855.2426137','4020.444585','4469.896904','2615.874982','19862.92009','2379.619573','1203.268956','4399.589212','6838.825864','1848.407564','3527.198403','33976.85042 ','818.8722263','634.6652078','469.2685928','4864.830004','5103.222941','1011.239929','829.9915382','8571.237936','3301.953656','14594.47385','25688.83822','4024.393045' '4163.775185','1775.894366','3682.012227','3371.092883','6651.509488','7906.092773','7297.133447','end','4566.874299','end','4255.700077','1857.648393', '11289.48095','2070.981805','1817.505094','1892.256615','1757.0048','59458.46328','778.5755201','54987.32423','2245.172711','722.2619663','5116.616632','3427.865861','17973.07118 '','14398.74281','66313.92115','11585.24151','45294.03043','6524.744077','25958.80015','593.3786209','2899.040703','85577.21342','153576.2633','5852.008444','563.0265409', '70796.45356', '565.2123689', '6560.030116', '2668.934414', '418.666014', '5216.392132', '760.894589', '8072.957639', '346.5905371', '結束']如何計算Python列表中的多個平均值

我想創建一個函數,給定一個bin(這是一個列表)(上面的例子),生成由字符串'end'分隔的數字的平均值。我期待有從上面的紙槽4點的平均值,因爲有4臺由4「結束」字符串分隔的數字

有人可以幫我解決我的代碼似乎低於不工作:

def average(bin): 
    total = 0.0 
    count=0 
    for number in bin:  
     if number==float(number): 
      total += float(number) 
      count+=1 
      avg = total/count 
     elif number=='end': 
      continue 

    return avg 
+1

如果數==浮子(數目):測試字符串「結束」時將引發ValueError。 –

+0

這是您獲取原始數據的表單嗎?這可能有一個更簡單的方法。我會在下面編輯我的答案以適應。 –

回答

1

您的代碼無法正常工作,因爲您在循環中的每次傳遞都覆蓋了avg。您將需要爲每個集合存儲值爲avg作爲列表或其他內容。每當遇到end時,還需要重置counttotal。試試這個:

def average(bin): 
    total = 0.0 
    count=0 
    avgs = [] 
    for number in bin:  
     if number == 'end': 
      avgs.append(avg) 
      total = 0.0 
      count = 0 
     else: 
      total += float(number) 
      count+=1 
      avg = total/count 

    return avgs 

注有更好的方式來實現自己的目標,但在認識興趣我試圖讓你的代碼儘可能少的變化。

+2

我認爲你必須交換if命令; float('end')否則會引發ValueError。 number == float(number)對於一個字符串數字也永遠不會成立。 – DSM

+0

@DSM謝謝,這是一個很好的抓住。我改變了代碼。 – aganders3

+0

更好地將'avg = total/count'移動到if塊的第一行 – ChessMaster

2

下面是計算這些平均一個非常簡潔的方式:

def average(bin): 
    start = 0 
    while 'end' in bin[start:]: 
     stop = bin.index('end', start) 
     if stop > start: 
      print sum(map(float, bin[start:stop]))/(stop-start) 
     start = stop+1 

如果你想保持你的平均的軌跡,可以存儲它們,在函數的最後返回他們:

​​

如果輸入中的行中有兩個「結束」標記,則「if stop> start:」行將阻止ZeroDivisionError。

爲了獲得更大的Python的魔法,你可以與產量替代打印效果和功能將成爲一臺發電機:

def average(bin): 
    start = 0 
    while 'end' in bin[start:]: 
     stop = bin.index('end', start) 
     if stop > start: 
      yield sum(map(float, bin[start:stop]))/(stop-start) 
     start = stop+1 

for a in average(bin): 
    print a 
4
def averages(bin): 
    li, s, n = [], 0, 0 
    for item in bin: 
     if item == 'end': 
      li.append(s/n) 
      s, n = 0, 0 
     else: 
      s += float(item) 
      n += 1 
    return li 

或者,你可以嘗試這一個班輪:

averages = [sum(k)/len(k) for k in [[float(j) for j in i.split() if j] for i in ' '.join(bin).split('end') if i]] 
+0

您的一個班輪,如果拉伸了幾行,將獲得我的+1。 – Droogans

+1

啊擰它,我重讀它,我喜歡它。 +1 – Droogans

0

這是一個解決方案(受其他人的啓發),它也給出了空集(NaN)的含義,而不是忽略它們。

def average(bin): 
    start=0  
    o=[] 
    while 'end' in bin[start:]: 
    stop = bin.index('end',start) 
    s=1.0/(stop-start) if stop>start else float('nan') 
    o.append(s*(sum(map(float, bin[start:stop])))) 
    start=stop+1 
    return o 

和相應的一個襯裏(基於一個通過科尼特)爲:

[sum(k)/len(k) if k else float('nan') for k in [ 
[float(j) for j in i.split() if j] for i in ' '.join(bin).split('end') if i]]