practika_boron/practika.py
2026-04-03 20:58:20 +03:00

127 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()