Отчет о такси
This commit is contained in:
parent
7f536ab740
commit
e8dbcb1818
4
data.txt
Normal file
4
data.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Руслан,Анна,10,200,завершен
|
||||||
|
Петр,Олег,5,90,отменен
|
||||||
|
Руслан,Максим,7,140,завершен
|
||||||
|
Сергей,Анна,3,75,завешен
|
||||||
127
practika.py
Normal file
127
practika.py
Normal file
@ -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()
|
||||||
Loading…
Reference in New Issue
Block a user