Сравнивайте пользователей по 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).