您可以使用blist的sorteddict来保持值的顺序。这里有一个快速实现的字典,当遍历,返回其键在其价值观的顺序(没有真正深入测试)的:
import collections
from blist import sorteddict
class ValueSortedDict(collections.MutableMapping):
def __init__(self, data):
self._dict = {}
self._sorted = sorteddict()
self.update(data)
def __getitem__(self, key):
return self._dict[key]
def __setitem__(self, key, value):
# remove old value from sorted dictionary
if key in self._dict:
self.__delitem__(key)
# update structure with new value
self._dict[key] = value
try:
keys = self._sorted[value]
except KeyError:
self._sorted[value] = set([key])
else:
keys.add(key)
def __delitem__(self, key):
value = self._dict.pop(key)
keys = self._sorted[value]
keys.remove(key)
if not keys:
del self._sorted[value]
def __iter__(self):
for value, keys in self._sorted.items():
for key in keys:
yield key
def __len__(self):
return len(self._dict)
x = ValueSortedDict(dict(a=1, b=4, c=3))
x['a'] += 1
print list(x.items())
x['a'] += 10
print list(x.items())
x['d'] = 4
print list(x.items())
这给:
[('a', 2), ('c', 3), ('b', 4)]
[('c', 3), ('b', 4), ('a', 12)]
[('c', 3), ('b', 4), ('d', 4), ('a', 12)]
我不知道在后端效率更高的结构。如果你保存了一个有序的键列表,那么你可以在那里节省几个时钟周期。你只需要在插入时对它进行排序,而不是像你现在有效地做的那样。你只是说'[keyList [i]]'来获取你的数据。 – Hoopdady
https://stackoverflow.com/questions/2298165/pythons-standard-library-is-there-a-module-for-balanced-binary-tree –