[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