| 
0
 | 
     1 """
 | 
| 
 | 
     2 Ordered dictionary implementation.
 | 
| 
 | 
     3 """
 | 
| 
 | 
     4 
 | 
| 
 | 
     5 from UserDict import UserDict
 | 
| 
 | 
     6 
 | 
| 
 | 
     7 class odict(UserDict):
 | 
| 
 | 
     8     """
 | 
| 
 | 
     9     http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
 | 
| 
 | 
    10 
 | 
| 
 | 
    11     This dictionary class extends UserDict to record the order in which items are
 | 
| 
 | 
    12     added. Calling keys(), values(), items(), etc. will return results in this
 | 
| 
 | 
    13     order.
 | 
| 
 | 
    14     """
 | 
| 
 | 
    15     def __init__( self, dict = None ):
 | 
| 
 | 
    16         self._keys = []
 | 
| 
 | 
    17         UserDict.__init__( self, dict )
 | 
| 
 | 
    18 
 | 
| 
 | 
    19     def __delitem__( self, key ):
 | 
| 
 | 
    20         UserDict.__delitem__( self, key )
 | 
| 
 | 
    21         self._keys.remove( key )
 | 
| 
 | 
    22 
 | 
| 
 | 
    23     def __setitem__( self, key, item ):
 | 
| 
 | 
    24         UserDict.__setitem__( self, key, item )
 | 
| 
 | 
    25         if key not in self._keys:
 | 
| 
 | 
    26             self._keys.append( key )
 | 
| 
 | 
    27 
 | 
| 
 | 
    28     def clear( self ):
 | 
| 
 | 
    29         UserDict.clear( self )
 | 
| 
 | 
    30         self._keys = []
 | 
| 
 | 
    31 
 | 
| 
 | 
    32     def copy(self):
 | 
| 
 | 
    33         new = odict()
 | 
| 
 | 
    34         new.update( self )
 | 
| 
 | 
    35         return new
 | 
| 
 | 
    36 
 | 
| 
 | 
    37     def items( self ):
 | 
| 
 | 
    38         return zip( self._keys, self.values() )
 | 
| 
 | 
    39 
 | 
| 
 | 
    40     def keys( self ):
 | 
| 
 | 
    41         return self._keys[:]
 | 
| 
 | 
    42 
 | 
| 
 | 
    43     def popitem( self ):
 | 
| 
 | 
    44         try:
 | 
| 
 | 
    45             key = self._keys[-1]
 | 
| 
 | 
    46         except IndexError:
 | 
| 
 | 
    47             raise KeyError( 'dictionary is empty' )
 | 
| 
 | 
    48         val = self[ key ]
 | 
| 
 | 
    49         del self[ key ]
 | 
| 
 | 
    50         return ( key, val )
 | 
| 
 | 
    51 
 | 
| 
 | 
    52     def setdefault( self, key, failobj=None ):
 | 
| 
 | 
    53         if key not in self._keys:
 | 
| 
 | 
    54             self._keys.append( key )
 | 
| 
 | 
    55         return UserDict.setdefault( self, key, failobj )
 | 
| 
 | 
    56 
 | 
| 
 | 
    57     def update( self, dict ):
 | 
| 
 | 
    58         for ( key, val ) in dict.items():
 | 
| 
 | 
    59             self.__setitem__( key, val )
 | 
| 
 | 
    60 
 | 
| 
 | 
    61     def values( self ):
 | 
| 
 | 
    62         return map( self.get, self._keys )
 | 
| 
 | 
    63 
 | 
| 
 | 
    64     def iterkeys( self ):
 | 
| 
 | 
    65         return iter( self._keys )
 | 
| 
 | 
    66 
 | 
| 
 | 
    67     def itervalues( self ):
 | 
| 
 | 
    68         for key in self._keys:
 | 
| 
 | 
    69             yield self.get( key )
 | 
| 
 | 
    70 
 | 
| 
 | 
    71     def iteritems( self ):
 | 
| 
 | 
    72         for key in self._keys:
 | 
| 
 | 
    73             yield key, self.get( key )
 | 
| 
 | 
    74 
 | 
| 
 | 
    75     def __iter__( self ):
 | 
| 
 | 
    76         for key in self._keys:
 | 
| 
 | 
    77             yield key
 | 
| 
 | 
    78 
 | 
| 
 | 
    79     def reverse( self ):
 | 
| 
 | 
    80         self._keys.reverse()
 | 
| 
 | 
    81 
 | 
| 
 | 
    82     def insert( self, index, key, item ):
 | 
| 
 | 
    83         if key not in self._keys:
 | 
| 
 | 
    84             self._keys.insert( index, key )
 | 
| 
 | 
    85             UserDict.__setitem__( self, key, item )
 |