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