4.6 KiB
def load_trips(path): data = [] try: # пробуем открыть файл f = open(path, "r", encoding="utf-8") except: # если файла нет или ошибка открытия print("Ошибка открытия файла:", path) return data # читаем построчно for line in f: line = line.strip() # убираем пробелы и переносы if line: # если строка не пустая data.append(line) f.close() # закрываем файл return data # возвращаем список строк
def parse_trip(line): parts = line.split(",") # разделяем по запятой
if len(parts) < 5: # проверяем на корректность данных
return None
# формируем словарь с ключами
return {
"driver": parts[0].strip(),
"client": parts[1].strip(),
"distance": parts[2].strip(),
"price": parts[3].strip(),
"status": parts[4].strip().lower() # делаем статус маленькими буквами
}
def convert_numeric_fields(trips): for t in trips: try: t["distance"] = float(t["distance"]) # дистанция в число except: t["distance"] = 0
try:
t["price"] = float(t["price"]) # переводим цену в число
except:
t["price"] = 0
return trips
def filter_completed_trips(trips): result = [] for t in trips: # оставляем только завершенные поездки if t and t.get("status") == "завершен": result.append(t) return result
def calculate_trip_cost_per_km(trip): d = trip.get("distance", 0) p = trip.get("price", 0) if d == 0: return 0 return p / d #стоимость 1 км
def add_cost_per_km(trips): for t in trips: # добовляем новое поле t["cost_per_km"] = calculate_trip_cost_per_km(t) return trips
def group_trips_by_driver(trips): grouped = {} for t in trips: name = t.get("driver", "Неизвестно") # если имя отсутствует
if name not in grouped:
grouped[name] = [] # Создаем новый список для водителей
grouped[name].append(t) # добовляем поездку в список
return grouped
def calculate_driver_earnings(grouped): result = {} for driver, trips in grouped.items(): total = 0 for t in trips: total += t.get("price", 0) # суммируем доход водителя result[driver] = total return result
def find_top_driver(earnings): best = "" max_sum = 0 for name, money in earnings.items(): if money > max_sum: # ищем максимальный доход max_sum = money best = name return best
def format_report(top_driver, total_revenue, avg_cost): report = [] report.append("===== ОТЧЕТ ПО ТАКСИ =====") report.append(f"Лучший водитель: {top_driver}") report.append(f"Общая выручка: {round(total_revenue, 2)} руб.") report.append(f"Средняя стоимость за км: {round(avg_cost, 2)} руб/км") return "\n".join(report)
def main(): raw = load_trips("data.txt") # читаем файл trips = [] for line in raw: trip = parse_trip(line) # разбираем строку в словарь if trip: trips.append(trip) convert_numeric_fields(trips) # числа вместо строк trips = filter_completed_trips(trips) # только завершённые поездки add_cost_per_km(trips) # добавляем поле с ценой за км grouped = group_trips_by_driver(trips) # группируем по водителям earnings = calculate_driver_earnings(grouped) # считаем доход best_driver = find_top_driver(earnings) # находим лучшего total = 0 sum_cost = 0 count = 0 for t in trips: total += t.get("price", 0) sum_cost += t.get("cost_per_km", 0) count += 1 avg = sum_cost / count if count else 0 # средняя цена за км report = format_report(best_driver, total, avg) # готовим текст отчёта print(report) # выводим в консоль if name == "main": main()