Подсчёт повторяемости уникальных комбинаций названия события и пользователя

Сначала посчитайте пары (title, user_id) через Counter, затем преобразуйте их в ключи title|user_id. Для null договоримся использовать строку null.

Короткий ответ

Что ответить на собеседовании

Сначала посчитайте пары (title, user_id) через Counter, затем преобразуйте их в ключи title|user_id. Для null договоримся использовать строку null.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо определить, как часто встречаются отдельные уникальные сочетания полей "title" и "user_id" в массиве событий. По каждому такому сочетанию нужно посчитать количество его появлений.

{
  "events": [
    {
      "time": "2022-06-17 08:54:03",
      "title": "search",
      "user_id": null,
      "ref": "main",
      "session_id": "a2"
    },
    {
      "time": "2022-06-17 23:19:33",
      "title": "main",
      "user_id": null,
      "ref": null,
      "session_id": "b4"
    },
    {
      "time": "2022-06-20 13:02:44",
      "title": "success",
      "user_id": null,
      "ref": "seats",
      "session_id": "b1"
    },
    {
      "time": "2022-06-20 14:45:43",
      "title": "search_click",
      "user_id": 123,
      "page": "main",
      "session_id": "a1"
    },
    {
      "time": "2022-06-20 14:46:49",
      "title": "main",
      "user_id": 123,
      "ref": null,
      "session_id": "a1"
    },
    {
      "time": "2022-06-17 23:21:31",
      "title": "search",
      "user_id": null,
      "ref": "main",
      "session_id": "b5"
    },
    {
      "time": "2022-06-18 13:02:44",
      "title": "main",
      "user_id": null,
      "ref": "seats",
      "session_id": "c2"
    },
    {
      "time": "2022-06-18 14:47:03",
      "title": "seats",
      "user_id": 123,
      "ref": "search",
      "session_id": "d1"
    },
    {
      "time": "2022-06-18 13:12:41",
      "title": "search",
      "user_id": null,
      "ref": "seats",
      "session_id": "c4"
    },
    {
      "time": "2022-06-20 14:44:01",
      "title": "chat_open",
      "user_id": 123,
      "page": "seats",
      "session_id": "d1"
    },
    {
      "time": "2022-06-20 14:46:32",
      "title": "chat_send_message",
      "user_id": 123,
      "page": "seats",
      "session_id": "d1"
    },
    {
      "time": "2022-06-21 13:12:41",
      "title": "seats",
      "user_id": 34,
      "ref": null,
      "session_id": "c4"
    },
    {
      "time": "2022-06-21 21:14:00",
      "title": "success",
      "user_id": null,
      "ref": null,
      "session_id": "b4"
    }
  ]
}

В результате должна получиться структура, где ключом будет строка вида "title|user_id", а значением – количество её появлений в исходном массиве.

Ответ

Сначала посчитайте пары (title, user_id) через Counter, затем преобразуйте их в ключи title|user_id. Для null договоримся использовать строку null.

from collections import Counter

def event_counts(payload):
    pairs = Counter((event['title'], event['user_id'])
                    for event in payload['events'])
    return {f'{title}|{user_id if user_id is not None else "null"}': count
            for (title, user_id), count in pairs.items()}

В примере search|null встречается 3 раза, main|null и success|null — по 2. Остальные шесть сочетаний встречаются по одному; сумма всех счётчиков равна 13.

Здесь user_id — целое число или null, как во входе. Если допускаются произвольные строки и разделитель внутри полей, простой составной ключ может быть неоднозначным: нужен escaping либо структурированное представление.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее