This content originally appeared on DEV Community and was authored by Kathan Vakharia
What are we trying to achieve?
If you recall from last post, here's the Method Resolution Order of Counter class:
There's no way we can swap the priority order. One option is to be cheeky ? and make use of the
__repr__
method of builtins.dict
Option1: Casting a Counter
Object to dict
By casting the Counter
to dict
, print
will use__repr__
method of dict
which will make sure, order is maintained!
But this doesn't draw the idea home, I mean what if a novice looks at this code? He has no idea why we are casting the
Counter
to dict
.
So a better approach would be to create our own custom Ordered_Counter
class for clarity.
Option 2: Creating a custom OrderedCounter
class
We can create a class that inherits from Counter
and implement it's __repr__
method,
The idea is still the same: cast the Counter
to dict
but this time by providing abstraction and thereby improving the readability of code.
class OrderedCounter(Counter):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
# casting 'self' to dict will do the job
return '%s(%r)' % (self.__class__.__name__, dict(self))
def __reduce__(self):
return self.__class__, (dict(self),)
Here, the instantiation(creation) of OrderedCounter
Object will be done by the __init__
method of Counter
class.
The __reduce__
method implementaton is necessary for 'PICKLING' purpose which we will discuss in some other post.
OrderedCounter
in action!
# creating Ordered Counters
ordered_c0 = OrderedCounter('kkkaaaajjjjkkaaakklll')
ordered_c1 = OrderedCounter(["oranges", "apples", "apples", "bananas",
"kiwis", "kiwis", "apples"])
print(ordered_c0, ordered_c1, sep='\n')
"""OUTPUT => Order Maintained
{'k': 7, 'a': 7, 'j': 4, 'l': 3}
{'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2}
"""
There are some other ways too, but knowing these two ways are more than enough!
References:
https://stackoverflow.com/questions/35446015/creating-an-ordered-counter
This content originally appeared on DEV Community and was authored by Kathan Vakharia

Kathan Vakharia | Sciencx (2021-06-16T05:19:05+00:00) Python’s Collections Module: OrderedCounter. Retrieved from https://www.scien.cx/2021/06/16/pythons-collections-module-orderedcounter/
Please log in to upload a file.
There are no updates yet.
Click the Upload button above to add an update.