[Python-Dev] tally (and other accumulators)
Georg Brandl
g.brandl at gmx.net
Tue Apr 4 19:35:50 CEST 2006
Alex Martelli wrote:
> On Apr 4, 2006, at 8:01 AM, Jeremy Hylton wrote:
>
>> On 4/4/06, Alex Martelli <aleaxit at gmail.com> wrote:
>>> import collections
>>> def tally(seq):
>>> d = collections.defaultdict(int)
>>> for item in seq:
>>> d[item] += 1
>>> return dict(d)
> ...
>> Putting it somewhere in collections seems like a great idea.
>> defaultdict is a bit odd, because the functionality doesn't have
>> anything to do with defaults, just dicts. maybe a classmethod on
>> regular dicts would make more sense?
>
> Good points: it should probably be a classmethod on dict, or a
> function in module collections.
>
>> I write this function regularly, so I'd be happy to have it
>> available directly.
>
> Heh, same here -- soon as I saw it proposed on c.l.py I recognized an
> old friend and it struck me that, simple but widely used, it should
> be somewhere in the standard library.
Why not make it collections.bag, like the following:
class bag(dict):
def __init__(self, iterable=None):
dict.__init__(self)
if iterable: self.update(iterable)
def update(self, iterable):
for item in iterable:
self.add(item)
def add(self, item):
self[item] = self.get(item, 0) + 1
def remove(self, item):
if self[item] == 1:
del self[item]
else:
self[item] -= 1
def count(self, item):
return self[item]
(etc.)
Georg
More information about the Python-Dev
mailing list