2013-05-13 71 views
1

查找值的在該領域[定量]平均大於或等於(337) 這是定量字段需要幫助上平均的Python

quant 
100 
7 
109 
204 
28 
292 
105 
254 
441 
401 
410 
14 
15 
51 
96 
403 
75 
31 
109 
17 

這是我試圖

代碼
import csv 

total = count = 0 

with open('3111111a.csv', newline='') as f: 
    reader = csv.reader(f) 
    next(reader, None) 

    for row in reader: 
     total += float(row[4]) 
     count += 1 

    if count: 
     average = total/count 
     print('The average of the values is {}'.format(average)) 
+2

你不應該只是平均數值大於或等於337? – LittleBobbyTables 2013-05-13 13:04:58

+0

對不起...我是一個初學者..我正在努力與此。是的,我應該,但我的代碼是錯誤的...我想 – Jake 2013-05-13 13:08:13

+0

sum([x for x in l if x> = 337])/ len(l)其中l是你定量列表 – Denis 2013-05-13 13:11:48

回答

5

試試這個:

#!/bin/env python 
import csv 
from itertools import islice 

total = count = 0 

with open('3111111a.csv', newline='') as f: 
    reader = csv.reader(f) 
    # `isslice` will skip any header/title row. 
    # Generates a list of integers from the fourth CSV value 
    numbers = (int(row[4]) for row in islice(reader, 1, None)) 
    # Generates another list of values that are >= 337 
    gt337 = [i for i in numbers if i >= 337] 

# Sums all the numbers in our list then divides by the number to get the average 
print (sum(gt337)/len(gt337)) 

最高分使用with

您可以從文檔中瞭解關於islice()List Comprehensions的更多信息。

有樂趣Python :-)

+0

我不斷收到一個錯誤「打印和總和之間的無效語法」。最後一行 – Jake 2013-05-13 13:31:45

+0

對不起 - 在'int(row [4])'部分錯過了')'。現在修復。 – Ewan 2013-05-13 13:32:32

+0

而不是手動執行兩次'int'並跳過頭文件,'islice(reader,1,None))'行中的numbers =(int(row [4])) - 然後從中創建列表 - 'gt337 = [我爲我在數字,如果我> = 337]'等... – 2013-05-13 13:35:58

1

這個「CSV」文件相當簡單,所以看起來並不需要使用CSV模塊。
i.strip().isdigit()跳過前導quant

>>> [i for i in open("average.csv", "r")] 
['quant\n', '100\n', '7\n', '109\n', '204\n', '28\n', '292\n', '105\n', '254\n', '441\n', '401\n', '410\n', '14\n', '15\n', '51\n', '96\n', '403\n', '75\n', '31\n', '109\n', '17\n'] 
>>> l = [int(i.strip()) for i in open("average.csv", "r")\ 
...   if i.strip().isdigit() and int(i) >= 337] 
>>> l 
[441, 401, 410, 403] 
>>> sum(l)/float(len(l)) 
413.75 

我知道,這個列表理解現在已經變得非常複雜,它可能不是最好的解決方案了,但我會讓它留在萬一有人有興趣使用類似的東西。畢竟,這是最緊湊的解決方案,您不必使用額外的模塊。

+2

如果字符「quant」是csv的一部分,該怎麼辦? – ilmiacs 2013-05-13 13:26:20

+1

如果'quant'是標題行,將會失敗。而且,通過OPs代碼的外觀,它們的值是行中的第四個('row [4]'),並且他們發佈了一個簡化的CSV示例。 – Ewan 2013-05-13 13:29:34

+0

@ilmiacs是的,這可以通過在if(int)(i)> = 337'後面加一個'和'來忽略,但不是以什麼形式表示這個單詞(「quant」),或者它總是「定量」。 – timss 2013-05-13 13:30:45