Pre-PEP: Dictionary accumulator methods

Steven Bethard steven.bethard at gmail.com
Sun Mar 27 16:20:33 EST 2005


Michele Simionato wrote:
> I am surprised nobody suggested we put those two methods into a
> separate module (say dictutils or even UserDict) as functions:
> 
> from dictutils import tally, listappend
> 
> tally(mydict, key)
> listappend(mydict, key, value)

Sorry to join the discussion so late (I've been away from my email for a 
week) but this was exactly my reaction too.  In fact, I have a 
'dicttools' module with similar methods in it:

# like "tally" but without ability to set increment
def counts(iterable, key=None):
     result = {}
     for item in iterable:
         # apply key function if necessary
         if key is None:
             k = item
         else:
             k = key(item)
         # increment key's count
         try:
             result[k] += 1
         except KeyError:
             result[k] = 1
     return result

# like "listappend" but with the option to use key and value funcs
def groupby(iterable, key=None, value=None):
     result = {}
     for item in iterable:
         # apply key function if necessary
         if key is None:
             k = item
         else:
             k = key(item)
         # apply value function if necessary
         if value is None:
             v = item
         else:
             v = value(item)
         # append value to key's list
         try:
             result[k].append(v)
         except KeyError:
             result[k] = [v]
     return result

These two functions have covered all my use cases for "tally" and 
"listappend" -- I always want to perform the increments or list appends 
over a sequence of values, so having functions that operate on sequences 
covers all my needs.

STeVe



More information about the Python-list mailing list