# Copyright (c) 2010-2024 openpyxl
[docs]
class IndexedList(list):
"""
List with optimised access by value
Based on Alex Martelli's recipe
http://code.activestate.com/recipes/52303-the-auxiliary-dictionary-idiom-for-sequences-with-/
"""
_dict = {}
def __init__(self, iterable=None):
self.clean = True
self._dict = {}
if iterable is not None:
self.clean = False
for idx, val in enumerate(iterable):
self._dict[val] = idx
list.append(self, val)
def _rebuild_dict(self):
self._dict = {}
idx = 0
for value in self:
if value not in self._dict:
self._dict[value] = idx
idx += 1
self.clean = True
def __contains__(self, value):
if not self.clean:
self._rebuild_dict()
return value in self._dict
[docs]
def index(self, value):
if value in self:
return self._dict[value]
raise ValueError
[docs]
def append(self, value):
if value not in self._dict:
self._dict[value] = len(self)
list.append(self, value)
[docs]
def add(self, value):
self.append(value)
return self._dict[value]