Нужна помощь в поиске среднего набора чисел в Python - PullRequest
4 голосов
/ 25 февраля 2011

в моем файле данных у меня есть

60,66,88,90,44,90,80,77

все числа в одной строке

это мой код, который не дает мне среднее число моих чисел

    inFile3 = open("data2.txt","r") 
    global gradeVar 
    gradeVar = len(gradeArray) 
    global Total 
    Total = 0 
    for Numbers in inFile3: 
            Total = Total + int(Numbers) 
    inFile3.close() 
    global averageVar 
    averageVar = Total/gradeVar 
    return averageVar 

Это ошибка

Traceback (most recent call last):
  File "program.py", line 81, in <module>
    main()
  File "program.py", line 5, in main
    averageVar = Average() 
  File "program.py", line 39, in Average
    Total = Total + int(Numbers) 
ValueError: invalid literal for int() with base 10: '60,66,88,90,44,90,80,77\n'

Ответы [ 6 ]

5 голосов
/ 25 февраля 2011

Ваша проблема здесь:

for Numbers in inFile3: 
        Total = Total + int(Numbers)

Numbers в приведенном выше коде - это список строк, а не список чисел.

for Line in inFile3:
    for number in Line.split(','):
        Total = Total + int(number)

должно помочь.

Вам также не нужно предварительно объявлять переменные, как в Python.На самом деле, делать это с помощью global опасно, если вы не знаете, что делаете и почему.

Редактировать: Если у вас когда-либо будет запятая в конце строки, пустое значение вы можете изменитьПоследняя строка:

        if number.strip():
            Total = Total + int(number)

При этом будут игнорироваться любые «пустые» числовые строки, которые в противном случае выдали бы ошибку.

2 голосов
/ 25 февраля 2011

В то время как другие указали на некоторые проблемы, связанные с тем, что вы делаете, ни один не указал, что среднему требуется не только сумма всех частей, но и количество всех элементов. Следовательно,

def parseNumberFile(file_name):
    for numbers in open(file_name, "r"):
        items = numbers.split(',')
        yield (len(items), sum(map(int,items)))

, который превращает его в генератор, который вы можете использовать как:

total = 0
count = 0
for x,y in parseNumberFile("myData.txt"):
    count += x
    total += y
average = total/count
2 голосов
/ 25 февраля 2011

Эта строка:

for Numbers in inFile3:

фактически выполняет итерацию по строкам файла, а не по номерам в каждой строке.Вам нужно перебрать строки, затем для каждой строки разбить ее на числа, примерно так:

for Line in inFile3: 
    for Number in Line.split(','): 
        Total = Total + int(Number) 
1 голос
/ 25 февраля 2011

Сообщение об ошибке говорит само за себя: '60,66,88,90,44,90,80,77\n', рассматриваемый как группа, не является допустимым целым числом. Вы должны рассмотреть их один за другим. Сначала удалите новую строку, затем разделите запятой.

Изменение:

for Numbers in inFile3: 

Кому:

# assumes numbers are all on one line with no spaces between
for Numbers in inFile3.read().strip().split(','):

Если бы мне пришлось переписать с нуля:

from __future__ import division  # this import is not needed in python 3
with open('data2.txt', 'r') as f:
    numbers = [int(n) for n in f.read().strip().split(',')]
    avg = sum(numbers) / len(numbers)
1 голос
/ 25 февраля 2011

Где вы читаете данные? Вам нужно будет прочитать его, а затем разбить строку на числа с чем-то вроде str.split () .

Вот более питонический способ:

inFile3 = open("data2.txt","r") 
grade_list = inFile3.readline()
inFile3.close()
num_list = [int(g) for g in grade_list.split(',')]
average = sum(num_list) / len(num_list)
print average
0 голосов
/ 25 февраля 2011

Изменить

for Numbers in inFile3: 

на

for Numbers in inFile3.strip().split(','): 
...