indexing an array
Question: I find myself frequently making indexed lists from flat ones in Python. This
is such a common task that I was wondering if there's a standard utility that
I should be using for it.

The context is this: given an array, I need to create a dict of smaller arrays
using some key for grouping.

e.g:  
`["Andy","Alice","Bob","Beth","Charlie"]` becomes  
`{"A":["Andy","Alice"],"B":["Bob","Beth"],"C":["Charlie"]}`

My solution looks like this:

    
    
    def make_index(data,key,value=lambda x:x):
        d={}
        for item in data:
            k = key(item)
            v = value(item)
            try: d[k].append(v)
            except KeyError: d[k]=[v]
        return d
    

It's simple and all, but am I reinventing something that is implemented better
elsewhere?


Answer: You can do the same a little simpler with a
[`defaultdict`](http://docs.python.org/library/collections.html#collections.defaultdict):

    
    
    from collections import defaultdict
    
    def make_index(data,key,value=lambda x:x):
        d=defaultdict(list)
        for item in data:
            d[key(item)].append(value(item))
        return d
    

Using a `defaultdict` is faster than using `.setdefault()`, which would be the
other option.

