Вернуть первое и последнее событие каждого пользователя за один проход
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 resultFor [("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.