2017-10-16 18 views
-1

如果非要给出的两个行值的CSV数据:如何从一个行平均,然后做一个清单出来的

years grades 
2001 98 
2001 75 
2008 100 
2003 57 
2008 50 

我有更多的价值,但我会尽量解释什么,我我正试图到达这里。

我想得到每年的平均值。例如,对于2001年,答案将是(98 + 75)/(2001年的数字,在这种情况下是2)。

def construct_values(filing): 
      """ 
     Parameters 
    ---------- 


    Returns 
    ------- 
    years: array of integers 
    average_grades: array of floats 
""" 


    years, average_grades = [], [] 
    grades = [] 

     with open('grades.csv', 'r') as filing: 
      next(filing) 
      for row in file_path: 
       year, grade = (s.strip() for s in row.split(',')) 
       years.append(year) 
       grades.append(grade) 


     return years, average_grades 

我所做的只是获得两个年份和年级的数组。我不知道如何获得平均数组,然后打印出如下:

2001, 88.5555例如,如果88.555是平均值。

我不想将它们当作词典,而是想要拥有两个数组,它们会一起返回。

回答

0

为什么不建的键是每年级别的字典:

from collections import defaultdict 
grades = defaultdict(lambda: []) 

with open('grades.csv', 'r') as f: 
    year, grade = (s.strip() for s in row.split(',')) 
    grades[year].append(grade) 

然后打印平均值:

for y, g in grades: 
    print('{}: {}', y, sum(g)/float(len(g))) 
+0

你失去秩序这样。 –

0

可以使用defaultdict形成一本字典,其值(grade)是一个清单,关键是year,然后在字典中追加同年级,之后data将是defaultdict(list)

defaultdict(<type 'list'>, {'2003': ['57'], '2008': ['100', '50'], '2001': ['98', '75']}) 

然后,您可以为循环键和值来计算平均:

from collections import defaultdict 
data = defaultdict(list) 
average_grade_by_year = dict() 
with open('grades.csv', 'r') as filing: 
    next(filing) 
    for row in filing: 
     year, grade = (s.strip() for s in row.split(',')) 
     data[year].append(grade) 
    for k, v in data.items(): 
     average_grade_by_year[k] = float(sum(int(x) for x in v))/len(v) 
print(average_grade_by_year) 

average_grade_by_year将是:{'2001': 86.5, '2003': 57.0, '2008': 75.0}

+0

与下面相同的评论。除非你使用有序的字典,否则你会失去命令。 –

相关问题