expression form of one-to-many dict?

Steven Bethard steven.bethard at gmail.com
Fri Dec 17 23:09:47 CET 2004


Tim Peters wrote:
>>The point here is that there's a simple sequence or GE that I can
>>throw to the dict constructor that spits out a dict with my one-to-
>>one mapping.
> 
> 
> It's a simple sequence because it's a simple task.  It's even simpler
> than perhaps it "should be", since it arbitrarily decides that, if
> more than one instance of some key is seen, it will only remember the
> value associated with the last instance of that key.

Good point.  That's sort of an arbitrary behavior decision, which, while 
reasonable in most situations is not desirable in mine.  In thinking 
about this, it struck me that one solution is to change that behavior:

 >>> class OneToMany(object, UserDict.DictMixin):
...     def __init__(*args, **kwds):
...         self, args = args[0], args[1:]
...         self._dict = {}
...         self.update(*args, **kwds)
...     def __getitem__(self, key):
...         if not key in self._dict:
...             self._dict[key] = []
...         return self._dict[key]
...     def __setitem__(self, key, value):
...         self[key].append(value)
...     def keys(self):
...         return self._dict.keys()
...
 >>> d = OneToMany((pow(i, 13, 4), i) for i in range(10))
 >>> d[0]
[0, 2, 4, 6, 8]
 >>> d[1]
[1, 5, 9]
 >>> d[3]
[3, 7]

I'll have to think about whether it would be worth keeping a class like 
this around...  It might make working with this kind of data 
interactively simpler...

Thanks for the comments!

Steve



More information about the Python-list mailing list