2015-05-04 2 views
0

Я пытался вычислить среднее значение третьего, четвертого и пятого значений в каждой строке файла .csv, но моя программа будет вычисляться только для первой строки, а не для каждый ряд. Например, этот код:Вычисление среднего значения определенного списка в Python

file=open("file.csv", "r") 
data=csv.reader(file) 

data=[[row[0],row[1],eval(row[2]),eval(row[3]),eval(row[4])] for row in data] 

from statistics import mean 

numbers=[row[2],row[3],row[4]] 
newdata=[[row[0],row[1],mean(numbers)] for row in data] 
sort=sorted(newdata,key=operator.itemgetter(2), reverse=True) 


for eachline in sort: 
    print(eachline) 

file.close() 

... читает этот файл:

Phillip,Turner,1,4,10 
Sarah,Connor,4,8,1 
Alex,Grice,2,10,3 
Cheesy,Wotsit,3,2,6 
Chris,Mclaughlin,10,9,8 
Alison,Humphries,4,2,6 

и производит это:

['Phillip', 'Turner', 4.0] 
['Sarah', 'Connor', 4.0] 
['Alex', 'Grice', 4.0] 
['Cheesy', 'Wotsit', 4.0] 
['Chris', 'Mclaughlin', 4.0] 
['Alison', 'Humphries', 4.0] 
+0

[ 1], средняя (строка [2:])] для строки в данных] ' – Jkdc

+0

, где вы получили идею t o использовать eval? Кроме того, это больше материала для экзамена gcse? –

+0

работал @Jkdc спасибо - напишите как ответ, и я лучше отвечу на него! – gulliver

ответ

0

На самом деле его не среднее значение первой линии, ее среднее от последнего. После первого понимания списка строка принимает значение последней строки, а когда вы используете строку [2] для создания списка чисел, вы создаете статический список, используя значения из последней строки.

Вы можете исправить это, сделав среднее правильные номера:

file=open("file.csv", "r") 
data=csv.reader(file) 

data=[[row[0],row[1],eval(row[2]),eval(row[3]),eval(row[4])] for row in data] 

from statistics import mean 

newdata=[[row[0],row[1],mean([row[2],row[3],row[4]])] for row in data] 
sort=sorted(newdata,key=operator.itemgetter(2), reverse=True) 


for eachline in sort: 
    print(eachline) 

file.close() 
0
import csv 
averages = [] 
with open("file.csv", "r") as f: 
    reader = csv.reader(f, delimiter=",") 
    for row in reader: 
    values = map(int, row[2:]) 
    averages.append(row + [sum(values)/float(len(values))]) 
for avg in sorted(averages,key=lambda x: x[-1]): 
    print avg  

печатает

['Cheesy', 'Wotsit', '3', '2', '6', 3.6666666666666665] 
['Alison', 'Humphries', '4', '2', '6', 4.0] 
['Sarah', 'Connor', '4', '8', '1', 4.333333333333333] 
['Phillip', 'Turner', '1', '4', '10', 5.0] 
['Alex', 'Grice', '2', '10', '3', 5.0] 
['Chris', 'Mclaughlin', '10', '9', '8', 9.0] 
0

Вы должны сделать это numbers=[row[2],row[3],row[4]] для каждой строки. Не один раз. Вы можете сделать:

In [511]: data = csv.reader(open('../a.csv')) 

In [512]: x = [[row[0], row[1], np.mean(map(float, row[2:]))] for row in data] 

In [513]: x 
Out[513]: 
[['Phillip', 'Turner', 5.0], 
['Sarah', 'Connor', 4.333333333333333], 
['Alex', 'Grice', 5.0], 
['Cheesy', 'Wotsit', 3.6666666666666665], 
['Chris', 'Mclaughlin', 9.0], 
['Alison', 'Humphries', 4.0]] 

In [514]: sorted(x, key=lambda v: v[2], reverse=True) 
Out[514]: 
[['Chris', 'Mclaughlin', 9.0], 
['Phillip', 'Turner', 5.0], 
['Alex', 'Grice', 5.0], 
['Sarah', 'Connor', 4.333333333333333], 
['Alison', 'Humphries', 4.0], 
['Cheesy', 'Wotsit', 3.6666666666666665]] 
0

попробовать так:

with open('your_file') as f: 
    for x in f: 
     x = x.strip().split() 
     print x + [sum(map(int,x[2:]))/float(len(x[2:]))] 
0

newdata=[[row[0],row[1],mean(numbers)] for row in data]

Должно быть

`NewData = [[[0], ряд строк

newdata=[[row[0],row[1],mean(row[2:])] for row in data]

Смежные вопросы