Определение пользователей, появившихся впервые

Сравнивайте пользователей по uid: создайте множество зарегистрированных идентификаторов и отфильтруйте входящий список, сохраняя порядок.

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

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

Сравнивайте пользователей по uid: создайте множество зарегистрированных идентификаторов и отфильтруйте входящий список, сохраняя порядок.

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

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

Условие

Нужно отобрать из входящего списка пользователей (incoming_users) тех, кто ещё не присутствует в списке уже зарегистрированных (registered_users). Функция должна вернуть только новых записей.

class User:
    uid: int
    create_dt: Optional[datetime]  # заполняется только при получении из БД

def find_new_users(incoming_users: List[User], registered_users: List[User]) -> List[User]:
    ...

registered_users = [
    User(uid=1, create_dt=...),
    User(uid=2, create_dt=...),
    User(uid=4, create_dt=...)
]

incoming_users = [
    User(uid=2),
    User(uid=4),
    User(uid=8),
    User(uid=16)
]

assert find_new_users(incoming_users, registered_users) == [
    User(uid=8),
    User(uid=16)
]

Ответ

Сравнивайте пользователей по uid: создайте множество зарегистрированных идентификаторов и отфильтруйте входящий список, сохраняя порядок.

from dataclasses import dataclass
from datetime import datetime

@dataclass
class User:
    uid: int
    create_dt: datetime | None = None

def find_new_users(incoming_users, registered_users):
    registered_ids = {user.uid for user in registered_users}
    return [user for user in incoming_users
            if user.uid not in registered_ids]

В примере вернутся пользователи 8 и 16. create_dt не участвует в определении новизны. Самих аннотаций в обычном классе недостаточно для конструктора User(uid=...); здесь его создаёт dataclass. Повторяющиеся новые uid во входящем списке сохраняются; если их нужно объединять, это отдельное условие. Сложность — O(n + m).

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

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

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

Подробнее