2015-05-20 5 views
2

У меня есть оценка в txt-файле и импортировано имя, зачисление в пустой список. Мне нужно знать, как получить средний балл из списка для txt-файла.Получение среднего от текстового файла

код

column = []  
for line in open('name,score.txt','r').readlines(): 
      column.append(line.strip(':')) 

Текст файла данных

pon : 9 
jon : 3 
bob: 10 
zack : 4 
cam : 5 
tim : 3 

Как получить среднее из списка ???

ответ

0

Вы находитесь сверх- усложняя это ребята. Просто извлечь номера из файла с помощью isdigit()

list_ = [float(x) for x in open(FILE).read().split() if x.isdigit()] 
    m = 1. *sum(list_)/len(list_) 
2

Есть несколько исправлений, необходимых

column = [] 
for line in open('test.txt','r').readlines(): 
     column.append(line.strip().split(':')[1]) # Strip the new lines 
                # Split on the : 
                # Append the second value 
column = map(int,column)       # Convert everything to int 
avg = sum(column)/len(column)      # Find the average using sum 
print (avg)          # Finally print it 

Обратите внимание, что ответ Kasra «s более вещий способ сделать это. Я только что скорректировал ваш код.

+0

thx для ответа.получить сообщение об ошибке tho: – user00

+0

avg = sum (column)/len (column) ValueError: недействительный литерал для int() с базой 10: 'pon: 9 \ n' – user00

+0

@ user00 Вы правильно поняли код? –

0

Получить все номера (не забудьте преобразовать их в целые числа) и сделать это

x=sum(list_of_numbers) 

Здесь x содержит сумму. Затем разделите сумму на длину этого списка.

for line in open('name,score.txt','r').readlines(): 
    column.append(int(line.split(':')[1])) 
print sum(column)/len(column) 
+0

получить сообщение об ошибке: NameError: имя 'list_of_numbers' не определено – user00

+1

@ user00, действительно ?! Это был просто пример. Фактический код находится в конце (он начинается с 'для строки ...' – ForceBru

1

В соответствии с форматом вашего текстового файла, то, после разделения каждой строки на : вы получите список с двумя значениями, первым затем имя и второй метки, поэтому вы должны использовать line.split(':')[1], The после итерация файла завершена, у вас есть несколько строк в списке column, чтобы выполнить любые арифметические операции над содержимым списка, который вам нужен, чтобы преобразовать все эти элементы списка в int, который выполняется с помощью функции map().

Кроме того, если вы используете Python 2.x, то вам явно нужно преобразовать либо один из sum(list) или len(list) плавать, в противном случае среднее всегда будет возвращено как int.

column = [] 
for line in open('name,score.txt','r').readlines(): 
    column.append(line.strip().split(':')[1]) 
column_int = map(int, column) 
print "average = ", sum(column_int)/float(len(column_int)) 
+0

Вы забыли «нарисовать» новые строки здесь –

+1

О, моя ошибка, Отредактировано. – ZdaR

0

Вам не нужно использовать readlines также как более вещий способ для работы с файлами вы можете использовать with statement, а затем использовать выражение генератора в sum функции:

with open('name,score.txt','r') as f : 
     s=sum(int(line.split(':')[-1]) for line in f) 
     l=sum(1 for _ in f) 
     avg=s/l 
+1

Да 'с' лучше –

+1

' l' is '0 'поэтому' ZeroDivisionError' файл находится в конце после первой полной итерации. –

0

Использование float для преобразования строк, чтобы избежать целочисленного divisison в Python 2:

with open('name,score.txt','r') as f : 
    data = [float(line.split(':')[-1]) for line in f] 
    avg = sum(data)/len(data) 

В with контекст менеджер гарантирует, что файл будет закрыт. Пояснение списка [float(line.split(':')[-1]) for line in f] считывает последний столбец после : в список поплавков. Наконец, среднее - это сумма всех чисел, деленная на счет, т. Е. Длина списка.