extracting order of class' attribute setting = statement execution or keyword assignments?

Josiah Carlson jcarlson at uci.edu
Fri Mar 12 08:33:20 CET 2004


Check out my cookbook item for a length-limited O(1) LRU Cache/Paging 
implementation.  You can toss the lengh-limititing and reorder-on-read 
semantics to get what you want.

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252524

Below is an implementation that will keep order, which you can easily 
iterate over, pull out a list with keys() or values() or items()...

  - Josiah



class LRU:
     """
     Implementation of a length-limited O(1) LRU queue.
     Built for and used by PyPE:
     http://pype.sourceforge.net
     Copyright 2003 Josiah Carlson.
     """
     class Node:
         def __init__(self, prev, me):
             self.prev = prev
             self.me = me
             self.next = None
     def __init__(self, pairs=[]):
         self.d = {}
         self.first = None
         self.last = None
         for key, value in pairs:
             self[key] = value
     def __contains__(self, obj):
         return obj in self.d
     def __getitem__(self, obj):
         return self.d[obj].me[1]
     def __setitem__(self, obj, val):
         if obj in self.d:
             del self[obj]
         nobj = self.Node(self.last, (obj, val))
         if self.first is None:
             self.first = nobj
         if self.last:
             self.last.next = nobj
         self.last = nobj
         self.d[obj] = nobj
     def __delitem__(self, obj):
         nobj = self.d[obj]
         if nobj.prev:
             nobj.prev.next = nobj.next
         else:
             self.first = nobj.next
         if nobj.next:
             nobj.next.prev = nobj.prev
         else:
             self.last = nobj.prev
         del self.d[obj]
     def __iter__(self):
         cur = self.first
         while cur != None:
             cur2 = cur.next
             yield cur.me[1]
             cur = cur2
     def iteritems(self):
         cur = self.first
         while cur != None:
             cur2 = cur.next
             yield cur.me
             cur = cur2
     def iterkeys(self):
         return iter(self.d)
     def itervalues(self):
         for i,j in self.iteritems():
             yield j
     def keys(self):
         return self.d.keys()




More information about the Python-list mailing list