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