Отбирайте объявления условием minimum <= price <= maximum. Проверьте обе границы, пустой вход, отсутствие совпадений и некорректный диапазон.
Поиск объявлений с ценой в указанном интервале
Отбирайте объявления условием minimum <= price <= maximum. Проверьте обе границы, пустой вход, отсутствие совпадений и некорректный диапазон.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан массив объявлений о недвижимости. Требуется реализовать функцию, которая отбирает только те объявления, у которых цена попадает в заданный диапазон (от минимального до максимального значения включительно). Помимо реализации функции, необходимо написать набор юнит‑тестов, подтверждающих корректность её работы.
ads = [
{"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},
# ...
]
Требования:
- Функция должна принимать три аргумента: минимальная цена, максимальная цена и список объявлений.
- Возвращаемое значение — список объявлений, цена которых находится в указанном диапазоне.
- Написать несколько тестов (например, с использованием
unittestилиpytest), которые проверяют граничные случаи, пустой список и обычный сценарий.
Ответ
Отбирайте объявления условием minimum <= price <= maximum. Проверьте обе границы, пустой вход, отсутствие совпадений и некорректный диапазон.
def filter_ads(minimum, maximum, ads):
if minimum > maximum:
raise ValueError('Минимум больше максимума')
return [ad for ad in ads if minimum <= ad['price'] <= maximum]
Примеры тестов:
import pytest
@pytest.mark.parametrize('low,high,prices,expected', [
(10, 20, [9, 10, 15, 20, 21], [10, 15, 20]),
(10, 10, [10, 11], [10]),
(10, 20, [], []),
(10, 20, [1, 30], []),
])
def test_filter(low, high, prices, expected):
data = [{'price': price} for price in prices]
assert [ad['price'] for ad in filter_ads(low, high, data)] == expected
def test_invalid_range():
with pytest.raises(ValueError):
filter_ads(20, 10, [])
Порядок и дубликаты сохраняются. Возвращается новый список, но сами словари не копируются. Цена предполагается обязательным числовым полем.