Проверяйте каждый переданный критерий через 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.