45
45
def __init__(self, data=None):
48
elif isinstance(data, GeneratorType):
49
# Unfortunately we need to be able to read a generator twice. Once
50
# to get the data into self with our super().__init__ call and a
51
# second time to setup keyOrder correctly
48
53
super(SortedDict, self).__init__(data)
49
54
if isinstance(data, dict):
50
55
self.keyOrder = data.keys()
53
59
for key, value in data:
54
if key not in self.keyOrder:
55
61
self.keyOrder.append(key)
57
64
def __deepcopy__(self, memo):
58
from copy import deepcopy
59
65
return self.__class__([(key, deepcopy(value, memo))
60
66
for key, value in self.iteritems()])
62
68
def __setitem__(self, key, value):
70
self.keyOrder.append(key)
63
71
super(SortedDict, self).__setitem__(key, value)
64
if key not in self.keyOrder:
65
self.keyOrder.append(key)
67
73
def __delitem__(self, key):
68
74
super(SortedDict, self).__delitem__(key)
69
75
self.keyOrder.remove(key)
71
77
def __iter__(self):
72
for k in self.keyOrder:
78
return iter(self.keyOrder)
75
80
def pop(self, k, *args):
76
81
result = super(SortedDict, self).pop(k, *args)
100
105
return iter(self.keyOrder)
102
107
def values(self):
103
return [super(SortedDict, self).__getitem__(k) for k in self.keyOrder]
108
return map(self.__getitem__, self.keyOrder)
105
110
def itervalues(self):
106
111
for key in self.keyOrder:
107
yield super(SortedDict, self).__getitem__(key)
109
114
def update(self, dict_):
110
for k, v in dict_.items():
111
self.__setitem__(k, v)
115
for k, v in dict_.iteritems():
113
118
def setdefault(self, key, default):
114
if key not in self.keyOrder:
115
120
self.keyOrder.append(key)
116
121
return super(SortedDict, self).setdefault(key, default)