Velocity Reviews > Search for mapping solution

# Search for mapping solution

Martin Maney
Guest
Posts: n/a

 07-10-2003
I dedicate this monument to Alan Kennedy, without whom I would probably
never have tried to compress things so.

Sean Ross <(E-Mail Removed)> wrote:
> lines = [['fred','333','0.10'],['sam','444','1'],['fred','333','0.50']]
> costs = {}
> # nearly identical to Achim's solution, but with a list comp.
> [costs.__setitem__(name, costs.get(name,0)+float(price))
> for name, number, price in lines]
> print costs
> # outputs: {'sam': 1.0, 'fred': 0.60}

It isn't really one line though, is it? For truly cryptic terseness
you want to swing functional (I shall adopt your interpretation of the
third element although seeing it as a list of integers would have

>>> lines = [['fred','333','0.10'],['sam','444','1'],['fred','333','0.50']]
>>> reduce(lambda d,x: d.update({x[0]: d.get(x[0],0.0) + float(x[2])}) or d, [{}] + lines)

{'fred': 0.59999999999999998, 'sam': 1.0}

Mind you, I normally despise the whole one-liner phenomenon, which
makes me almost pleased about the inelegant necessity of that 'or d' -
blame it on either update's lack of a return value or lambda's
emasculation. But as I've been working my way through SICP as this
summer's project, it certainly seems odd. :-/

--
automation: replacing what works with something that almost works,
but which is faster and cheaper. - attributed to Roger Needham