creating and appending to a dictionary of a list of lists

Ant antroy at gmail.com
Wed Aug 15 13:08:53 CEST 2007


On Aug 15, 3:30 am, pyscottish... at hotmail.com wrote:
> Hey,
>
> I started with this:
>
> factByClass = {}
>
...
> def update(key, *args):
>     x = factByClass.setdefault(key, [[], [], [], [] ])
>     for i, v in enumerate(args):
>         x[i].append(v)
>
> Is there a better way?

Well, the following is perhaps neater:

>>> factByClass = defaultdict(lambda: [[],[],[],[]])
>>> def update(key, *args):
...   map(list.append, factByClass[key], args)
...
>>> update('one', 1, 2, 3, 4)
>>> update('one', 5, 6, 7, 8)
>>> update('two', 9, 10, 11, 12)
>>>
>>> print factByClass
defaultdict(<function <lambda> at 0x00F73430>, {'two': [[9], [1
0], [11], [12]], 'one': [[1, 5], [2, 6], [3, 7], [4, 8]]})

It abuses the fact that list.append modifies the list in place -
normally you would use map to get a new list object. In this case the
new list returned by map is just a list of None's (since append
returns None - a common idiom for functions that operate by side
effect), and so is not used directly.

--
Ant...

http://antroy.blogspot.com/






More information about the Python-list mailing list