Проблема в том, что вам нужно отсортировать или хэшировать его по ключам , чтобы получить разумную производительность при вставке и поиске.Наивным способом его реализации была бы сортированная по значению древовидная структура записей и диктат для поиска позиции дерева для ключа.Вам нужно углубиться в обновление дерева, так как этот словарь поиска должен быть правильным.По сути, как и в случае с обновляемой кучей.
Я полагаю, что существует слишком много вариантов, чтобы сделать разумную стандартную библиотеку из такой структуры, хотя это слишком редко требуется.
Обновление : хитрость, которая может работать для вас, заключается в использовании двойной структуры:
обычного dict
для хранения пар ключ-значение как обычно
любой вид отсортированного списка, например, с использованием bisect
Затем необходимо выполнить общие операции для обоих: новое значение вставляется вобе структуры.Сложной частью являются операции обновления и удаления.Первая структура используется для поиска старого значения, удаления старого значения из второй структуры, а затем (при обновлении) повторной вставки, как и раньше.
Если вам также необходимо знать ключи, сохраните (значение, ключ) пар в вашем списке.
Обновление 2 : попробуйте этот класс:
import bisect
class dictvs(dict):
def __init__(self):
self._list = []
def __setitem__(self, key, value):
old = self.get(key)
if old is None:
bisect.insort(self._list, value)
dict.__setitem__(self, key, value)
else:
oldpos = bisect.bisect_left(self._list, old)
newpos = bisect.bisect_left(self._list, value)
if newpos > oldpos:
newpos -= 1
for i in xrange(oldpos, newpos):
self._list[i] = self._list[i + 1]
else:
for i in xrange(oldpos, newpos, -1):
self._list[i] = self._list[i - 1]
self._list[newpos] = value
dict.__setitem__(self, key, value)
def __delitem__(self, key):
old = self.get(key)
if old is not None:
oldpos = bisect.bisect(self._list, old)
del self._list[oldpos]
dict.__delitem__(self, key)
def values(self):
return list(self._list)
Это еще не полный dict
, но я думаю.Я не проверял удаления, а только небольшой набор обновлений.Вы должны сделать для него больший модульный тест и сравнить возвращение values()
с возвращением sorted(dict.values(instance))
.Это просто, чтобы показать, как обновить отсортированный список с bisect