Do dictionaries in python maintain insertion order?
Well if your answer was NO, time to update your python knowledge because they do maintain their insertion order in python 3.6+ and completely from python 3.7+
But a Counter
object doesn't,
from collections import Counter
nums = [1, 1, 2, 2, 2, 3, 5, 5, 5]
#You would expect the order of counts,
# to be 1->2->3->5
print(Counter(nums))
"""Output: But it didn't work that way!
Counter({2: 3, 5: 3, 1: 2, 3: 1})
"""
Why printing Counter doesn't maintain insertion order despite the fact it is a dict sub-class?
The reason behind this is the __repr__
method implementation of Counter object.
The __repr__
method decides object's representation when displaying it using print()
function.
Don't worry if above definition looks complex at first sight :)
Let's try to get insights from this method definition,
Focus on the code inside the try
block because that's what decides what happens while we print a Counter
.
Aha! we can see the call to most_common method
and that's what causing the descending order. MYSTERY SOLVED🔥 or is it?
But...
You might have a doubt. Considering Counter is infact a sub class of builtins.dict
, why it doesn't obey dictionary class's __repr__
and maintain insertion order 🤔
The Method Resolution Order (MRO)
To put it simply, MRO defines the order in which python interpreter searches a method for a particular object,
Method Resolution Order can be found using ClassName.__mro__
attribute or calling help
on that Class.
It is evident that, __repr__
of Counter's priority is higher than that of builtins.dict
and that's the reason while printing Counter object doesn't maintain insertion order.
Then how the heck Counter
can maintain insertion order when printing it 😐, How about you find yourself? OR as always
STAY TUNED for the next post 😉
Top comments (0)