1 from UserDict import DictMixin
7 class OrderedDict(DictMixin):
9 def __init__(self, *args, **kwds):
11 self.update(*args, **kwds)
15 self._content = {} # {key: (index, value)}
19 return OrderedDict(self)
22 for key in self._keys:
23 if key is not DELETED:
27 return [key for key in self._keys if key is not DELETED]
34 raise KeyError, 'OrderedDict is empty'
36 return k, self._content.pop(k)[1]
38 def __getitem__(self, key):
39 index, value = self._content[key]
42 def __setitem__(self, key, value):
44 index, oldvalue = self._content[key]
46 index = len(self._keys)
47 self._keys.append(key)
48 self._content[key] = index, value
50 def __delitem__(self, key):
51 index, oldvalue = self._content.pop(key)
52 self._keys[index] = DELETED
53 if self._deleted <= len(self._content):
60 i, value = self._content[k]
61 self._content[k] = len(newkeys), value
67 return len(self._content)
70 res = ['%r: %r' % (key, self._content[key][1]) for key in self]
71 return 'OrderedDict(%s)' % (', '.join(res),)
73 def __cmp__(self, other):
74 if not isinstance(other, OrderedDict):
77 r = cmp(keys, other.keys())
81 r = cmp(self[k], other[k])