Соберите множество кортежей (title, user_id) и возьмите его длину. В представленном наборе 9 уникальных сочетаний.
Определение количества уникальных пар title и user_id
Соберите множество кортежей (title, user_id) и возьмите его длину. В представленном наборе 9 уникальных сочетаний.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо посчитать, сколько разных сочетаний названия события (поле "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) и возьмите его длину. В представленном наборе 9 уникальных сочетаний.
def count_pairs(payload):
return len({(event['title'], event['user_id'])
for event in payload['events']})
После разбора JSON значение null представлено как None и может входить в хешируемый кортеж. Повторные события search, main и success с user_id=None не увеличивают число сочетаний. При этом ('main', None) и ('main', 123) — разные пары, как и seats для пользователей 123 и 34.
Временные метки и сессии не входят в ключ уникальности. Ожидаемая сложность — O(n) по времени и O(k) по памяти, где k — число разных пар.