IndexDict — как получить значение из dict по индексу?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Пропустим прелюдия, и не будем объяснять зачем это нужно. Будем прям как математики - сразу перейдем к делу.

Вам нужна структура данных которая и в словарь может и в индексы тоже ? Так вот же она:

(Обращение к элементу по индексу и ключу O(1), Нет большого оверхеда на хранение значений в словаре и в списке, так как это одни и те же объекты)

class IndexDict:
    """
    Словарь к которому можно обращаться по индексу.  
    """
    __slots__ = ['_date', '_index_list', '_index']

    def __init__(self):
        self._date = {}
        self._index_list = []
        self._index = 0

    def add(self, k, v):
        """
        Добавить элемент

        В лучшем O(1)
        В худшем O(N) * если все новые значения повторяются
        """
        # Исключаем дублирование в списке `_index_list`
        if self._date.get(k, None):
            self._index_list.remove(k)

        self._index_list.append(k)
        self._index += 1
        self._date[k] = v

    def removeKey(self, k: str):
        """
        Удаление по ключу

        В лучшем O(1)
        В худшем O(N) * если удаляться с конца массива
        """
        self._date.pop(k)
        self._index_list.remove(k)
        self._index -= 1

    def removeIndex(self, i: int):
        """
        Удаление по индексу

        В любом O(1)
        """
        self._date.pop(self._index_list.pop(i))
        self._index -= 1

    def getFromKey(self, k: str):
        """
        Получить значение по ключу

        В любом O(1)
        """
        return self._date[k]

    def getFromIndex(self, i: int):
        """
        Получит значение по индексу

        В любом O(1)
        """
        return self._date[self._index_list[i]]

Пример использования

if __name__ == '__main__':
    a = IndexDict()
    # ----------
    a.add('СПБ', 'Санкт-Петербург')
    a.add('МСК', 'Москва')
    a.add('ЕКБ', 'Екатеринбург')
    a.add('СО', 'Сочи')
    # ----------
    print(a.getFromIndex(2))
    print(a.getFromKey('ЕКБ'))
    if id(a.getFromIndex(2)) == id(a.getFromKey('ЕКБ')):
        print("Объекты равны")
    # -----------
    a.removeIndex(2)
    a.removeKey('СО')
    # -----------
    print(a.getFromIndex(1))
    print(a.getFromKey('СПБ'))
    # -----------

Источник: https://habr.com/ru/post/683780/


Интересные статьи

Интересные статьи

Привет, Хабр! И я та самая HR из HazelCoders из статьи, которая помогает в поиске разработчиков в Американские компании
Здравствуйте. Вдохновляясь статьями на этом сайте, читая насколько проста и безболезненна лазерная коррекция зрения методом Relex SMILE, спустя 3 года размышлений я все же решился и записался на опера...
Герои наших статей переезжают в другие страны по рабочей визе и остаются там на несколько лет, получив ВНЖ или ПМЖ. А что насчёт гражданства? Попробовали разобрат...
Just AI стал первым аккредитованным технологическим партнером SberDevices по созданию голосовых навыков для виртуальных ассистентов Салют. Теперь бизнес может заказывать ...
Пришло время посмотреть на тип модели классов UML, который можно встретить во множестве проектов. А ещё, увы, который часто поощряется в книгах по UML. Чита...