Blog

Python Dictionary Order

August 09, 2022

Python Dictionaries Now Keep Insertion Order

An implementation detail in python 3.6 and now a language feature in python 3.7+, python’s regular dict now retains insertion order.

Message from Guido van Rossum:

Make it so. “Dict keeps insertion order” is the ruling. Thanks!

From the python 3.7 release highlights:

the insertion-order preservation nature of dict objects has been declared to be an official part of the Python language spec.

Demo:

d = {}
d['a'] = 1
d['b'] = 2
d['c'] = 3
d['d'] = 4
for key, value in d.items():
print(key, value)

You can expect the above code block to always print this:

a 1
b 2
c 3
d 4

So what is the point of OrderedDict now if the regular dict can keep insertion order? OrderedDict/Dict Meme

OrderedDict Is Still Useful

Even with the new changes, regular dict doesn’t really replace OrderedDict.

Breaking Code

Relying on this new feature will cause code to break on earlier versions of python. When we typically talk about python we are usually talking about the CPython implementation but there are also many different implementations. Your code will also break on implementations that haven’t caught up to the CPython 3.7 implementation.

Declaring Intent

Using OrderedDict over dict makes it clear to other people that the order of dictionary items is important.

Equality

The equality comparisons for OrderedDict is order sensitive while this is still not the case for the regular dict (as of python 3.9).

>>> dict([(1,2), (2,3)]) == dict([(2,3), (1,2)])
True
>>> OrderedDict([(1,2), (2,3)]) == OrderedDict([(2,3), (1,2)])
False

Other Functionalities

The OrderedDict also has a move_to_end() method.

From the python OrderedDict documentation:

OrderedDict has a move_to_end() method to efficiently reposition an element to an endpoint.

A regular dict does not have an efficient equivalent for OrderedDict’s od.move_to_end(k, last=False) which moves the key and its associated value to the leftmost (first) position.

reversed() for regular python dict didn’t exist until python 3.8 see docs

Conclusion

The new dict doesn’t really replace OrderedDict. Adoption of new features is also a slow process so it might take a while before this feature becomes more widely used.


Derzan Chiang
Dev blog by Derzan Chiang