Поиск объявлений с ценой в указанном интервале

Отбирайте объявления условием 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},
    # ...
]

Требования:

  1. Функция должна принимать три аргумента: минимальная цена, максимальная цена и список объявлений.
  2. Возвращаемое значение — список объявлений, цена которых находится в указанном диапазоне.
  3. Написать несколько тестов (например, с использованием 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, [])

Порядок и дубликаты сохраняются. Возвращается новый список, но сами словари не копируются. Цена предполагается обязательным числовым полем.

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

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

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

Подробнее