Package advene :: Package util :: Module sorted_dict
[hide private]
[frames] | no frames]

Source Code for Module advene.util.sorted_dict

  1  from bisect import bisect, insort 
  2   
  3  _NO_DEFAULT = object() 
  4   
5 -class SortedDict(dict):
6 __slots__ = ["_keys",] 7
8 - def __init__ (self, arg=None, **kw):
9 if arg: 10 dict.__init__(self, arg, **kw) 11 else: 12 dict.__init__(self, **kw) 13 arg_keys = getattr(arg, "keys", None) 14 if callable(arg_keys): 15 keys = self._keys = arg_keys() 16 self._keys.sort() 17 else: 18 keys = self._keys = [] 19 if arg is not None: 20 for k,_ in arg: 21 insort(keys, k) 22 for k in kw: 23 insort(keys, k)
24
25 - def __delitem__(self, k):
26 if k in self: 27 keys = self._keys 28 i = bisect(keys, k) 29 del keys[i-1:i] 30 return dict.__delitem__(self, k)
31
32 - def __setitem__(self, k, v):
33 if k not in self: 34 insort(self._keys, k) 35 return dict.__setitem__(self, k, v)
36
37 - def clear(self):
38 del self._keys[:] 39 return dict.clear(self)
40
41 - def pop(self, k, d=_NO_DEFAULT):
42 v = dict.pop(self, k, _NO_DEFAULT) 43 if v is not _NO_DEFAULT: 44 keys = self._keys 45 i = bisect(keys, k) 46 del keys[i-1:i] 47 return v 48 elif d is _NO_DEFAULT: 49 raise KeyError, k 50 else: 51 return d
52
53 - def popitem(self):
54 r = dict.popitem(self) 55 keys = self._keys 56 i = bisect(keys, r[0]) 57 del keys[i-1:i] 58 return r
59
60 - def setdefaults(self, k, d=None):
61 v = self.get(k, _NO_DEFAULT) 62 if v is _NO_DEFAULT: 63 self[k] = d 64 v = d 65 return v
66
67 - def update(self, e=None, **f):
68 e_keys = getattr(e, "keys", None) 69 if callable(e_keys): 70 for k in e_keys(): 71 self[k] = e[k] 72 elif e is not None: 73 for k, v in e: 74 self[k] = v 75 for k, v in f.iteritems(): 76 self[k] = v
77
78 - def keys(self):
79 return list(self._keys)
80
81 - def values(self):
82 return [ self[k] for k in self._keys ]
83
84 - def items(self):
85 return [ (k, self[k]) for k in self._keys ]
86
87 - def iterkeys(self):
88 return iter(self._keys)
89
90 - def itervalues(self):
91 return ( self[k] for k in self._keys )
92
93 - def iteritems(self):
94 return ( (k, self[k]) for k in self._keys )
95 96 97 if __name__ == "__main__": 98 d = SortedDict({"c":"C"}, b="B", d="D") 99 print d.items() 100 d["a"] = "A" 101 print d.items() 102 del d["b"] 103 print d.items() 104 d.pop("e", "E") 105 d.pop("d") 106 print d.items() 107 print d.popitem(), 108 print d.items() 109 d.update({"b":"BB"}, c="CC") 110 d.update([("a", "AA")]) 111 print d.items() 112 print d.setdefaults("a", "AAA"), 113 print d.setdefaults("d", "DD"), 114 print d.items() 115 d.clear() 116 print d.items() 117