[Python-ideas] OrderedCounter and OrderedDefaultDict

Ian Foote ian at feete.org
Fri Oct 16 12:36:42 CEST 2015


I recently wanted to use an OrderedCounter and an OrderedDefaultDict. 
After a bit of googling I discovered that OrderedCounter is quite easy 
to implement:

from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict):
      'Counter that remembers the order elements are first seen'
      def __repr__(self):
          return '%s(%r)' % (self.__class__.__name__,
                             OrderedDict(self))
      def __reduce__(self):
          return self.__class__, (OrderedDict(self),)


from https://rhettinger.wordpress.com/2011/05/26/super-considered-super/

Unfortunately an OrderedDefaultDict did not seem so easy. I did find 
http://stackoverflow.com/questions/6190331/can-i-do-an-ordered-default-dict-in-python 
which suggests:

|fromcollections 
importOrderedDict,CallableclassDefaultOrderedDict(OrderedDict):# Source: 
http://stackoverflow.com/a/6190500/562769def__init__(self,default_factory=None,*a,**kw):if(default_factory 
isnotNoneandnotisinstance(default_factory,Callable)):raiseTypeError('first 
argument must be 
callable')OrderedDict.__init__(self,*a,**kw)self.default_factory 
=default_factory 
def__getitem__(self,key):try:returnOrderedDict.__getitem__(self,key)exceptKeyError:returnself.__missing__(key)def__missing__(self,key):ifself.default_factory 
isNone:raiseKeyError(key)self[key]=value 
=self.default_factory()returnvalue 
def__reduce__(self):ifself.default_factory isNone:args =tuple()else:args 
=self.default_factory,returntype(self),args,None,None,self.items()defcopy(self):returnself.__copy__()def__copy__(self):returntype(self)(self.default_factory,self)def__deepcopy__(self,memo):importcopy 
returntype(self)(self.default_factory,copy.deepcopy(self.items()))def__repr__(self):return'OrderedDefaultDict(%s, 
%s)'%(self.default_factory,OrderedDict.__repr__(self))|


This seems to me both easy to get wrong and hard to discover. It also 
risks getting out of sync with updates to collections.
I'm wondering if this is sufficient justification to add OrderedCounter 
and OrderedDict to collections, either directly or as recipes.

Thanks,
Ian F
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20151016/ba1a8d67/attachment.html>


More information about the Python-ideas mailing list