Гибкая фильтрация объявлений по ценовому диапазону и названию

Проверяйте каждый переданный критерий через is not None и объединяйте условия логическим И. Нулевая граница цены должна работать как обычное значение.

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

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

Проверяйте каждый переданный критерий через is not None и объединяйте условия логическим И. Нулевая граница цены должна работать как обычное значение.

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

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

Условие

Имеется массив объектов‑объявлений. Требуется реализовать функцию, которая возвращает те объявления, цены которых находятся внутри указанного диапазона и/или название которых содержит заданный подстроковый запрос. Каждый из критериев – нижняя граница цены, верхняя граница цены и поисковый запрос по названию – должен быть необязательным, т.е. если параметр не передан, соответствующий фильтр не применяется.

items = [
    {"title": "3-к. квартира, 80м², 13/22 эт.", "rooms": 3, "price": 70000, "petFriendly": True},
    {"title": "2-к. квартира, 45м², 5/5 эт.", "rooms": 2, "price": 60000, "petFriendly": False, "deposit": 60000},
    {"title": "2-к. квартира, 44м², 4/4 эт.", "rooms": 2, "price": 45000, "petFriendly": True, "agency": True},
    {"title": "2-к. квартира, 44м², 4/4 эт.", "rooms": 2, "price": 45000, "petFriendly": True, "agency": True, "fee": 45000},
    # ...
]

Функция должна принимать список объявлений и три необязательных аргумента: min_price, max_price и query. При отсутствии любого из этих аргументов соответствующий критерий фильтрации игнорируется. Возвращаемое значение – список объявлений, удовлетворяющих всем указанным условиям.

Пример вызова:

result = filter_ads(items, min_price=50000, max_price=80000, query="квартира")

Ответ

Проверяйте каждый переданный критерий через is not None и объединяйте условия логическим И. Нулевая граница цены должна работать как обычное значение.

def filter_ads(items, min_price=None, max_price=None, query=None):
    if min_price is not None and max_price is not None and min_price > max_price:
        raise ValueError('Некорректный диапазон')
    needle = query.casefold() if query is not None else None
    return [item for item in items
            if (min_price is None or item['price'] >= min_price)
            and (max_price is None or item['price'] <= max_price)
            and (needle is None or needle in item['title'].casefold())]

Границы включены, поиск по названию выбран регистронезависимым. Пустой запрос совпадает с любым названием. Порядок и повторяющиеся объявления сохраняются; возвращается новый список ссылок на исходные словари. Предполагаются валидные обязательные поля price и title.

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

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

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

Подробнее