[Python-Dev] collections module
Robert Brewer
fumanchu at amor.org
Sat Jan 10 14:37:46 EST 2004
Raymond H. quoted Martin L. thusly:
> > Both applications could be implemented if dictionaries had
> > the notion of a default value, which would be generated
> > by a callable (whether with or without argument is debatable)
> >
> > # count things
> > d = {}
> > d.defaultmaker = lambda k:0
> > for t in things:
> > d[t] += 1
> >
> > # sort things by category
> > d = {}
> > d.defaultmaker = lambda k:[]
> > for t in things:
> > d[category(t)].append(t)
Then answered with:
> These both read cleanly.
>
> I really like this idea as a general purpose solution with broad
> applicability. It fully encapsulates the ideas behind bag
> construction and building dicts of lists.
>
> Instead of a method, it may be better to use a keyword argument in the
> constructor:
>
> d = dict(default = lambda k:[])
> for t in things:
> d[category(t)].append(t)
>
> If lambda is made parameterless, it allows type constructors
> to be used
> for the most common cases:
>
> dict(default=list) # this is clear enough
> dict(default=int) # this may be too cute
This seems a bit too easy to do "as needed" to warrant a new builtin,
but that's why we have proposals, I guess:
class DefaultingDict(dict):
def __init__(self, default):
self.default = default
def __getitem__(self, key):
return self.get(key, self.default())
>>> d = DefaultingDict(lambda: 0)
>>> d.update({'a': 1, 'b': 2, 'c': 3})
>>> d
{'a': 1, 'c': 3, 'b': 2}
>>> for x in ['a', 'b', 'c', 'd']:
... d[x] += 1
...
>>> d
{'a': 2, 'c': 4, 'b': 3, 'd': 1}
Robert Brewer
MIS
Amor Ministries
fumanchu at amor.org
More information about the Python-Dev
mailing list