Сначала посчитайте пары (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 либо структурированное представление.