Вернуть первое и последнее событие каждого пользователя за один проход
events — список пар (user_id, timestamp) в произвольном порядке. Верните dict, сопоставляющий каждому пользователю (first_ts, last_ts) — его самое раннее и самое позднее время события.
Сделайте один проход — не сортируйте весь список и не пересканируйте его на пользователя.
def first_last_events(events: list[tuple[str, int]]) -> dict[str, tuple[int, int]]:
# ваш код здесь
Напишите реализацию.
Держите dict по пользователю. Для каждого события, если пользователь новый, кладите (ts, ts), иначе расширяйте пару до (min(first, ts), max(last, ts)). Один проход O(n) даёт раннее и позднее время каждого пользователя — без сортировки и пересканирования.
- ✗Сортировать весь список, когда хватает одного прохода min/max
- ✗Фильтровать на пользователя, пересканируя список O(n*u) раз
- ✗Считать, что порядок входа совпадает с порядком времён
- →Как заодно вернуть число событий каждого пользователя?
- →Что меняется, если у двух событий одно время?
Keep a dict keyed by user. New user seeds (ts, ts); a repeat user widens its pair with min on the first slot and max on the last. One pass, O(n) time.
def first_last_events(events):
result = {}
for user, ts in events:
if user not in result:
result[user] = (ts, ts)
else:
first, last = result[user]
result[user] = (min(first, ts), max(last, ts))
return result
For [("a", 5), ("b", 2), ("a", 1), ("a", 9)] user a collapses to (1, 9) and b to (2, 2). There is no sort and no per-user filter — every event touches its user's pair exactly once, so the whole job is a single linear scan.