Я бы разделил диапазон на кортеж, а затем внутри вашего класса оставил бы элементы в упорядоченном списке. Вы можете использовать модуль bisect для создания вставок O (n) и поиска O (logn).
Если вы конвертируете дикт в ваш новый класс, вы можете создать неупорядоченный список и отсортировать его в конце
doodahs = [
(0, 256, "FOO"),
(257, 257, "BAR"),
(258, 258, "FISH"),
(279, 279, "MOOSE"),
(280, 65534, "Darth Vader"),
(65535, 65535, "Death to all newbies")]
Ваш __getitem__
может работать примерно так:
def __getitem__(self, key):
return self.doodahs[bisect.bisect(self.doodahs, (key,))]
__setitem__
может выглядеть примерно так:
def __setitem__(self,range,value):
bisect.insort(self.doodahs, range+(value,))