Skip to content

OrderedDict

An OrderedDict is just a dict having an order of items.

When iterating through an OrderedDict, the order is the FIFO. The first item added to the dict will be the first you'll get during iteration.

Naive OrderedDict

It seems not hard? A list holding the keys will finish the work. At least, it looks so.

Poor Man OrderedDict

class UnderneathAllPoorManOrderedDict(dict):
    def __init__(self, mapping={}):
        self._key_list = []
        super().__init__(self)
        self.update(mapping)

    def __setitem__(self, key, value):
        if key not in self:
            self._key_list.append(key)
        super().__setitem__(key, value)

    def __iter__(self):
        for k in self._key_list:
            yield k

    def __delitem__(self, key):
        self.pop(key)

    def __reversed__(self):
        for k in self._key_list[::-1]:
            yield k

    def pop(self, key):
        self._key_list.remove(key)
        return super().pop(key)

    def keys(self):
        return self.__iter__()

    def items(self):
        for k in self._key_list:
            yield (k, self[k])

Run

ua_ordered_dict = UnderneathAllPoorManOrderedDict()
ua_ordered_dict['b'] = 1
ua_ordered_dict['c'] = 3
ua_ordered_dict['a'] = 2
del ua_ordered_dict['c']
for k in ua_ordered_dict:
    print(k)

Output

b
c
a

Run

for k in reversed(ua_ordered_dict):
    print(k)

Output

a
c
b

Run

del ua_ordered_dict['c']
for k in ua_ordered_dict:
    print(k)

Output

b
a

We use a _key_list to store all the keys. However, performance will be a big issue.

In the real OrderedDict, Link is used to store all the keys in order.