/lib/galaxy/util/odict.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 85 lines · 57 code · 18 blank · 10 comment · 9 complexity · 22509e2490ce5a3439f9826a6f3efca9 MD5 · raw file

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