Мой цикл for завершается без завершения каждого числа в списке

#python

#python

Вопрос:

Это мой код, я обращаюсь к файлу с именем pollution.txt и я пытаюсь найти среднее значение всех чисел в каждой строке, а затем отобразить его.

 def month_average(monthlist):
    monthlist = open("pollution.txt", 'r')
    file = monthlist.readlines()
    print("The monthly averages are as follows:")
    for line in file:
        eachline = list(line.split(","))
        count = 0
        sum_all = 0
        average = []
        for x in eachline:
            number = int(x)
            count = count   1
            sum_all = sum_all   number
            avg = sum_all / count
        average.append(round(avg, 1))
    return average

the_average = month_average("pollution.txt")
print(the_average)
 

Это небольшая часть из pollution.txt

 132,142,154,151,143,164,158,150,146,78,141,32,141,142,112,113,116,123,123,119,152,123,127,163,142,85,88,151,142,113,114
89,78,67,65,56,98,123,144,179,86,82,90,172,124,156,187,122,154,144,165,87,152,93,157,134,87,167,98,156,145,133
45,73,167,165,122,148,125,128,75,123,182,144,143,33,122,147,122,178,144,138,87,152,93,57,134,87,67,98
67,54,83,45,56,98,92,121,153,115,98,80,59,63,84,121,144,119,103,97,83,75,56,64,81,99,102,114,116,103,97
 

Комментарии:

1. Сразу же странно, что имя файла встречается дважды. Я предлагаю вам устранить это и просто жестко запрограммировать данные в вашем примере, а затем сообщить нам, что вы получаете и чего ожидали. Вы передаете имя файла monthlist, а затем перезаписываете его файловым объектом.

Ответ №1:

Ваша проблема в том, что вы переназначаете average каждый цикл for.

Исправленный код:

 #!/usr/bin/env python3

def month_average(monthlist):
    monthlist = open("pollution.txt", 'r')
    file = monthlist.readlines()
    average = []  # initialize once only
    print("The monthly averages are as follows:")
    for line in file:
        eachline = list(line.split(","))
        count = 0
        sum_all = 0
        # average = []  # mistake is here
        for x in eachline:
            number = int(x)
            count = count   1
            sum_all = sum_all   number
            avg = sum_all / count
        average.append(round(avg, 1))
    return average

the_average = month_average("pollution.txt")
print(the_average)
 

Вывод:

 The monthly averages are as follows:
[128.4, 122.3, 117.8, 91.7]
 

Ответ №2:

Прежде всего, было бы лучше использовать конструкцию «with as» для работы с файлом ввода-вывода. Понимание второго списка, на мой взгляд, будет более читабельным.

В результате код может быть переписан заново:

 def average_by_line(line):
    data_array = list(map(int, line.split(",")))
    return sum(data_array) / len(data_array)


def month_average(monthlist):
    with open("pollution.txt", 'r') as monthlist:
        file = monthlist.readlines()
        averages = [average_by_line(line) for line in file]
    return averages

the_average = month_average("pollution.txt")
print(the_average)
 

Ответ №3:

Простая реализация

 def month_average(file_obj):
    average = []
    with open(file_obj) as fp:
        lines = fp.readlines()
        for line in lines:
            line = line.strip().split(',')
            temp = 0
            for item in line:
                temp  = int(item)
            average.append(temp/len(line))
    return average

reqdAvg = month_average("pollution.txt")
print(reqdAvg)
 

Ответ №4:

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

 import csv

def month_average(monthlist):
    with open(monthlist, newline="") as file:
        reader = csv.reader(file, delimiter=",")
        averages = [round(sum(map(int,line))/len(line)) for line in reader]
        return averages

the_average = month_average("pollution.txt")
print(the_average)