diff --git a/data.txt b/data.txt new file mode 100644 index 0000000..f1b33f0 --- /dev/null +++ b/data.txt @@ -0,0 +1,4 @@ +Руслан,Анна,10,200,завершен +Петр,Олег,5,90,отменен +Руслан,Максим,7,140,завершен +Сергей,Анна,3,75,завешен \ No newline at end of file diff --git a/practika.py b/practika.py new file mode 100644 index 0000000..c7ebc49 --- /dev/null +++ b/practika.py @@ -0,0 +1,127 @@ +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() \ No newline at end of file