
Пропустим прелюдия, и не будем объяснять зачем это нужно. Будем прям как математики — сразу перейдем к делу.
Вам нужна структура данных которая и в словарь может и в индексы тоже ? Так вот же она:
(Обращение к элементу по индексу и ключу 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/
Добавить комментарий