당신을위한 N 큰 키를 유지하는 사용자 정의 OrderedDict입니다 :
from collections import OrderedDict
from operator import itemgetter
class LimitedSizeOrderedDict(OrderedDict):
def __init__(self, *args, **kwds):
self.maxlen = kwds.pop("maxlen", None)
if args:
try:
top_n = sorted(*args, key=itemgetter(0, 0))[-self.maxlen:]
self.min_key = top_n[0][0]
except TypeError:
raise Exception("keys should be in tuple format")
else:
self.min_key = (float("inf"), 0)
super(LimitedSizeOrderedDict, self).__init__(top_n, **kwds)
def __setitem__(self, key, value):
if self._check_size():
OrderedDict.__setitem__(self, key, value)
if key[0] < self.min_key[0]:
self.min_key = key
elif key[0] > self.min_key[0]:
self.pop(self.min_key)
OrderedDict.__setitem__(self, key, value)
self.min_key = min(self, key=itemgetter(0))
def _check_size(self):
if self.maxlen is not None:
if len(self) < self.maxlen:
return True
return False
return True
데모 :
In [2]: a = LimitedSizeOrderedDict([((7,2),3), ((2, 5), 3), ((6, 0), 1)], maxlen= 2)
In [3]: a
Out[3]: LimitedSizeOrderedDict([((6, 0), 1), ((7, 2), 3)])
In [4]: a[(12, 5)] = 10
In [5]: a
Out[5]: LimitedSizeOrderedDict([((7, 2), 3), ((12, 5), 10)])
In [6]: a[(10, 5)] = 9
In [7]: a
Out[7]: LimitedSizeOrderedDict([((12, 5), 10), ((10, 5), 9)])
In [8]: a[(0, 5)] = 9
In [9]: a
Out[9]: LimitedSizeOrderedDict([((12, 5), 10), ((10, 5), 9)])
방법이 사전을 창조 하셨 는가? 사전을 만들거나 시간을 만들 때 이것을하고 싶습니까? – Kasramvd
'numpy'를 사용하지 않는다면, O (n)에서 상단 또는 하단 k를 찾을 수있는'partition'과'argpartition'을가집니다. –
죄송합니다. 제 사전을 기억할 수 없다고 설명해야합니다. – Black