Temporary variables in list comprehensions
Ben Bacarisse
ben.usenet at bsb.me.uk
Mon Jan 9 18:11:18 EST 2017
Steven D'Aprano <steve+comp.lang.python at 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.
More information about the Python-list
mailing list