Список с индексацией, начинающейся с 1

Храните обычный список внутри класса и переводите внешний индекс i во внутренний i − 1. Явно отклоняйте нулевые и отрицательные индексы.

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

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

Храните обычный список внутри класса и переводите внешний индекс i во внутренний i − 1. Явно отклоняйте нулевые и отрицательные индексы.

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

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

Условие

Необходимо реализовать класс MathList, который имитирует обычный список, но использует нумерацию элементов, стартующую с 1 вместо привычного 0. Экземпляр этого класса должен поддерживать добавление элементов через метод append, а также чтение и изменение значений по индексу, где первый элемент имеет индекс 1.

a = MathList()

a.append(1)
a.append(2)

assert a[1] == 1
assert a[2] == 2

a[2] = 3
assert a[2] == 3

Ответ

Храните обычный список внутри класса и переводите внешний индекс i во внутренний i − 1. Явно отклоняйте нулевые и отрицательные индексы.

class MathList:
    def __init__(self):
        self.items = []

    def append(self, value):
        self.items.append(value)

    def _index(self, index):
        if type(index) is not int:
            raise TypeError('Нужен целый индекс')
        if not 1 <= index <= len(self.items):
            raise IndexError('Индекс вне диапазона')
        return index - 1

    def __getitem__(self, index):
        return self.items[self._index(index)]

    def __setitem__(self, index, value):
        self.items[self._index(index)] = value

    def __len__(self):
        return len(self.items)

    def __iter__(self):
        return iter(self.items)

Отдельный __iter__ нужен, чтобы обход не пытался начать с индекса 0. Срезы здесь не поддерживаются: их семантику при нумерации с единицы следует определять отдельно.

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

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

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

Подробнее