питон; Операторы if, Циклы For, Чтение файлов

Чтобы было ясно, я не прошу никого делать это за меня. Я просто задаю вопрос в поисках руководства, чтобы продолжить работу над этим.

Нам дан файл, в котором указаны различные веса пакетов;

11
25
12
82
20
25
32
35
40
28
50
51
18
48
90

Мне нужно создать программу, которая будет подсчитывать количество пакетов, классифицировать их на маленькие, средние и большие и находить средний вес. Я знаю, что должен использовать операторы If и циклы for, чтобы накапливать весовые коэффициенты и классифицировать их по каждой категории.

Термины для того, что маленькое, среднее и большое, следующие;

Маленький ‹ 10 фунтов

Средний >= 10 фунтов. и ‹ 30 фунтов

Большой >= 30 фунтов.

Если не введено ни одной упаковки какой-либо весовой категории, сообщайте сообщение «Н/Д» вместо средней (при попытке разделить на 0 вы получите исключение).

Это код, который у меня есть до сих пор, я не могу понять, нужно ли включать цикл for после if, elif и еще. Или если то, что у меня есть, находится на пути.

infile = open("packages.txt", 'r')
count = 0
line = infile.readline()
weight = int(line)
for line in infile:
    if weight < 10:
        count = count + 1
        weight = weight + int(line)
        while weight < 10:
            try:
                avg = weight / count
            except ValueError:
                print("N/A")
    elif weight >= 10:
        if weight < 30:
            weight = weight + int(line)
            count = count + 1
            avg = weight/count
    else:
        weight = weight + int(line)
        count = count + 1
        avg = weight/count

Вывод должен выглядеть примерно так

Category    Count    Average
Small       0        N/A
Medium      7        19.9
Large       8        53.5

Опять же, я не ищу кого-то, кто сделает это за меня. Я ищу следующий шаг и / или настройки того, что у меня есть в настоящее время, чтобы иметь возможность двигаться вперед. Благодарю вас!


person H. Raydon    schedule 31.10.2018    source источник


Ответы (3)


Для начала вам нужны три переменные weight и count: по одной для каждой категории.

Тогда ваше чтение для файла немного ошибочно. Не начинайте с чтения строки, вместо этого просто создайте цикл и первым делом назначьте weight внутри цикла.

Возможно что-то вроде этого:

total_small = 0
total_medium = 0
total_large = 0
count_small = 0
count_medium = 0
count_large = 0

for line in infile:
    weight = int(line)

    if weight < 10:
        total_small += weight
        count_small += 1
    # And the same for medium and large as well...

Затем после цикла вы можете легко вычислить среднее значение каждой категории при печати.

О, и вы не проверяете верхний предел средних пакетов, что вам нужно сделать.

person Some programmer dude    schedule 31.10.2018
comment
Как проверить верхний предел? Должно ли это быть сделано в части ELIF моей структуры управления? - person H. Raydon; 31.10.2018
comment
@H.Raydon Условие должно быть таким, если вес больше или равен 10 И вес меньше 30. Любая книга или учебник по Python должны рассказать вам, как выполнять такие условия. - person Some programmer dude; 31.10.2018

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

Другими словами, вам не нужно вызывать метод close() для файлового объекта, и вы уверены, что в случае возникновения исключения, вызов будет закрыт.

So

infile = open("packages.txt", 'r')
#operations on file
...
infile.close()

будет лучше использовать

with open("packages.txt",'r') as infile:
    #following operation 
    #on infile like reading

Среднее вычисление

Для этой операции вы можете использовать словарь. Это структура данных карты, набор из key,value пар, где ключ должен быть строкой (в вашем случае "маленький", "средний", "большой") и < strong>значение может быть простым типом или другой структурой данных, такой как список, словарь или объект.

При чтении файла вы будете заполнять списки весами на основе условности, а в конце вы можете использовать свободные списки и вычислять среднее значение, используя sum() и len().

packages = {"small": [],
            "medium": [],
            "large": []}

with open("packages.txt","r") as packs:
    for pack in packs:
        weight = int(pack)
        if weight < 10:
            packages["small"].append(weight)
        elif weight < 30:
            packages["medium"].append(weight)
        else:
            packages["large"].append(weight)
###Printing the the average###
table_row = "%s\t%i\t%s" # string for formatting output, not the best solution
for key,weights in packages.items():
    print(table_row % (key, len(weights), averageValues(weights)))

Где averageValues() — это следующая функция, которая вычисляет среднее значение и возвращает его в виде строки по количеству десятичных знаков, которое мы хотим.

def averageValues(values,decimals=1):
    float = "%." +  str(decimals) + "f"
    try:
        avg = sum(values)/len(values)
        return float % avg
    except:
        return "N/A"

Прочтите ответы на этот вопрос, чтобы понять, как упорядоченное представление словаря, это неупорядоченная структура данных.

person Iulian    schedule 31.10.2018

поддерживать 3 переменную для подсчета 3 диапазонов, таких как weight1Sum,weight2Sum,weight3Sum, и инициализировать ее нулем в самом начале, например, weight1Sum = 0

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

как правило, вам нужно поддерживать 3 веса в соответствии с диапазоном и обновлять его.

person PushpikaWan    schedule 31.10.2018