[Python-Dev] collections module
Raymond Hettinger
python at rcn.com
Sat Jan 10 14:26:17 EST 2004
[Martin]
> I do believe that bag classes
> got into libraries only for academic reasons such as symmetry. In
> particular, they got into Smalltalk because of that reason, and
> everybody copies it because Smalltalk has it. This has to stop :-)
Some much for "everybody else has one" justification ;-)
> 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)
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
Or, lambda could be avoided altogether by cloning a default value
dict(default=[]) # individual default values computed by
copy([])
dict(default=0)
> Having a key in the lambda is probably better, as it would
> also allow lazily-filled dictionaries.
Can you give an example?
Raymond Hettinger
More information about the Python-Dev
mailing list