Напишите программу, которая для заданного файла вычисляет следующие параметры:
- количество всех чисел;
- количество положительных чисел;
- минимальное число;
- максимальное число;
- сумма всех чисел;
- среднее арифметическое всех чисел с точностью до двух знаков после запятой.
Формат ввода
Пользователь вводит два имени файла.
Первый файл содержит произвольное количество чисел, разделённых пробелами и символами перевода строки
Формат вывода
Выведите статистику во второй файл в формате JSON.
Ключи значений задайте соответственно:
- count — количество всех чисел;
- positive_count — количество положительных чисел;
- min — минимальное число;
- max — максимальное число;
- sum — сумма всех чисел;
- average — среднее арифметическое всех чисел с точностью до двух знаков после запятой.
Пример
Ввод
# Пользовательский ввод:
numbers.txt
statistics.json
# Содержимое файла numbers.txt
1 2 3 4 5
-5 -4 -3 -2 -1
10 20
20 10
Вывод
# Содержимое файла statistics.json
{
"count": 14,
"positive_count": 9,
"min": -5,
"max": 20,
"sum": 60,
"average": 4.29
}
Решение
Задача на вывод словаря с помощью json.dump(). Читаем данные удобным способом, создаем словарь и заполняем его нужными значениями. Выводим словарь в json-файл.
Посмотреть код
Решение
Python
import json
file_in = input().strip()
file_out = input().strip()
with open(file_in, encoding="UTF-8") as file:
numbers = [int(number) for number in file.read().split()]
stat = {
"count": (length := len(numbers)),
"positive_count": len([number for number in numbers if number > 0]),
"min": min(numbers),
"max": max(numbers),
"sum": (total := sum(numbers)),
"average": round(total / length, 2),
}
with open(file_out, "w", encoding="UTF-8") as file:
json.dump(stat, file, ensure_ascii=False, indent=4)
Подскажите в чём ошибка
import json
lst = []
dct = {}
file_1 = input().strip()
file_2 = input().strip()
with open(file_1, mode=‘r’, encoding=‘UTF-8’) as file_in:
for line in file_in:
sline = line.rstrip(‘\n’)
for numb in sline:
lst.append(int(numb))
dct[‘count’] = len(lst)
dct[‘positive_count’] = len([x for x in lst if x > 0])
dct[‘min’] = min(lst)
dct[‘max’] = max(lst)
dct[‘sum’] = sum(lst)
dct[‘average’] = round(dct[‘sum’] / dct[‘count’], 2)
with open(file_2, mode=‘w’, encoding=‘UTF-8’) as file_out:
json.dump(dct, file_out, ensure_ascii=False, indent=4)
Вы забыли разбить строку на числа и поэтому перебираете ее посимвольно. В итоге код дает ошибку на первом же встретившемся пробеле. Чтобы исправить проблему достаточно заменить sline = line.rstrip(‘\n’) на sline = line.rstrip(‘\n’).split()
Самое любопытное, что я этот код тестил на текстовых файликах(пример ввода -> пример вывода с точностью до символа), он работал корректно) почему так?
Сложно сказать. В том виде как был представлен здесь он работать не должен.
Возможно, у вас на компьютере образовалось два очень похожих файла в одном из которых было правильное решение, а в другом это.
Да действительно, долго думая над “почему оно вообще работает” нашёл упущенный split() после попытки оптимизировать код =) Не вовремя отвлёкся видимо, спасибо вам за всю ясность в моей голове ☺