Python; Если заявления, для циклов, чтения файлов - PullRequest
0 голосов
/ 31 октября 2018

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

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

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

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

Термины «маленький», «средний» и «большой» следующие:

Маленький <10 фунтов </p>

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

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

Если нет упаковок весом класс введен, сообщите сообщение «N / A» вместо среднего (если вы пытаетесь делите на 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

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

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Для начала вам нужно три 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...

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

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

0 голосов
/ 31 октября 2018

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

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

Итак

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 пар, где key должны быть строками (в вашем случае "small", "medium", "large") и значение может быть простым типом или другой структурой данных, такой как список, словарь или объект.

При чтении файла вы будете заполнять списки весами, основанными на условных условных выражениях, а в конце вы можете использовать свободные списки и вычислять среднее с помощью 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"

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

0 голосов
/ 31 октября 2018

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

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

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

...