mirror of
https://github.com/rdkit/rdkit.git
synced 2026-06-04 21:54:27 +08:00
57 lines
1.3 KiB
Python
Executable File
57 lines
1.3 KiB
Python
Executable File
# $Id$
|
|
#
|
|
# Copyright (C) 2003-2006 Rational Discovery LLC
|
|
#
|
|
# @@ All Rights Reserved @@
|
|
#
|
|
import bisect
|
|
class TopNContainer(object):
|
|
""" maintains a sorted list of a particular number of data elements.
|
|
|
|
"""
|
|
def __init__(self,size,mostNeg=-1e99):
|
|
self._size = size
|
|
self.best = [mostNeg]*self._size
|
|
self.extras = [None]*self._size
|
|
def Insert(self,val,extra=None):
|
|
""" only does the insertion if val fits """
|
|
if val > self.best[0]:
|
|
idx = bisect.bisect(self.best,val)
|
|
# insert the new element
|
|
if idx == self._size:
|
|
self.best.append(val)
|
|
self.extras.append(extra)
|
|
else:
|
|
self.best.insert(idx,val)
|
|
self.extras.insert(idx,extra)
|
|
# and pop off the head
|
|
self.best.pop(0)
|
|
self.extras.pop(0)
|
|
|
|
def GetPts(self):
|
|
""" returns our set of points """
|
|
return self.best
|
|
def GetExtras(self):
|
|
""" returns our set of extras """
|
|
return self.extras
|
|
|
|
def __len__(self):
|
|
return self._size
|
|
def __getitem__(self,which):
|
|
return self.best[which],self.extras[which]
|
|
|
|
def reverse(self):
|
|
self.best.reverse()
|
|
self.extras.reverse()
|
|
|
|
if __name__ == '__main__':
|
|
import random
|
|
pts = [int(100*random.random()) for x in range(10)]
|
|
|
|
c = TopNContainer(4)
|
|
for pt in pts:
|
|
c.Insert(pt,extra=str(pt))
|
|
print c.GetPts()
|
|
print c.GetExtras()
|
|
|