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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *