Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> writes:

> Suppose you have an expensive calculation that gets used two or more times in 
> a 
> loop. The obvious way to avoid calculating it twice in an ordinary loop is 
> with 
> a temporary variable:
>
> result = []
> for x in data:
>     tmp = expensive_calculation(x)
>     result.append((tmp, tmp+1))
>
>
> But what if you are using a list comprehension? Alas, list comps don't let 
> you 
> have temporary variables, so you have to write this:
>
>
> [(expensive_calculation(x), expensive_calculation(x) + 1) for x in data]
>
>
> Or do you? ... no, you don't!
>
>
> [(tmp, tmp + 1) for x in data for tmp in [expensive_calculation(x)]]
>
>
> I can't decide whether that's an awesome trick or a horrible hack...

Nor I (but then I'm not really a Pythonista).  However I would use a
lambda as the natural way to create a local binding:

  [(lambda tmp: (tmp, tmp+1))(expensive_calculation(x)) for x in data]

-- 
Ben.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to