| from typing import TypedDict | |
| class PathSummary(TypedDict): | |
| average_speed_m_per_s: float | |
| success_rate: float | |
| total_distance_m: float | |
| def summarize_paths(records: list[dict]) -> PathSummary: | |
| """Summarize simple path history records. | |
| Each record is expected to have: | |
| - distance_m (float) | |
| - duration_s (float) | |
| - success ("yes"/"no") | |
| """ | |
| if not records: | |
| return { | |
| "average_speed_m_per_s": 0.0, | |
| "success_rate": 0.0, | |
| "total_distance_m": 0.0, | |
| } | |
| total_distance = 0.0 | |
| total_duration = 0.0 | |
| success_count = 0 | |
| for r in records: | |
| d = float(r.get("distance_m", 0.0)) | |
| t = float(r.get("duration_s", 0.0)) | |
| total_distance += d | |
| total_duration += max(t, 0.0) | |
| if str(r.get("success", "")).lower() == "yes": | |
| success_count += 1 | |
| avg_speed = total_distance / total_duration if total_duration > 0 else 0.0 | |
| success_rate = success_count / len(records) | |
| return { | |
| "average_speed_m_per_s": round(avg_speed, 3), | |
| "success_rate": round(success_rate, 3), | |
| "total_distance_m": round(total_distance, 3), | |
| } | |
| if __name__ == "__main__": | |
| example_records = [ | |
| {"distance_m": 6.0, "duration_s": 40, "success": "yes"}, | |
| {"distance_m": 8.0, "duration_s": 50, "success": "no"}, | |
| ] | |
| print(summarize_paths(example_records)) | |