Making things more functional in Python

Dave Benjamin ramen at lackingtalent.com
Sat Mar 5 02:28:19 EST 2005


On Sat, 2005-03-05 at 00:00 -0700, Dave Benjamin wrote:
> On Fri, 2005-03-04 at 08:36 -0800, gf gf wrote:
> > Is there a better, more FP style, more Pythonic way to
> > write this:
> > 
> > def compute_vectors(samples, dset):
> > 	vectors = {}
> > 	for d in dset:
> > 		vectors[d] = [sample.get_val(d) for sample in
> > samples]
> > 	return vectors
> 
> You could use reduce:
> 
> def compute_vectors(samples, dset):
>     def add_entry(vectors, d):
>         vectors[d] = [sample.get_val(d) for sample in samples]
>         return vectors
>     return reduce(add_entry, dset, {})

This could be further generalized:

def compute(xs, ys, f):
    def add_entry(result, y):
        result[y] = [f(x, y) for x in xs]
        return result
    return reduce(add_entry, ys, {})

Now, compute_vectors is just:

compute(samples, dset, lambda x, y: x.get_val(y))

You could even abstract the method call:

def method(name):
    def _method(obj, *args, **kwds):
        return getattr(obj, name)(*args, **kwds)
    return _method

compute(samples, dset, method('get_val'))

Dave





More information about the Python-list mailing list