127 lines
4.5 KiB
Python
127 lines
4.5 KiB
Python
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() |