[Python-ideas] Accessing the result of comprehension's expression from the conditional
Lie Ryan
lie.1296 at gmail.com
Sat Jun 20 00:31:26 CEST 2009
Steven D'Aprano wrote:
> On Fri, 19 Jun 2009 05:39:32 pm Lie Ryan wrote:
>> Aahz wrote:
>>> On Fri, Jun 19, 2009, Lie Ryan wrote:
>>>> In list/generator comprehension, currently we have no way to
>>>> access the result of the expression and have to write something
>>>> like this:
>>>>
>>>> [f(x) for x in l if f(x) > 0]
>>>>
>>>> if f() is heavy or non-pure (i.e. have side effects), calling f()
>>>> twice might be undesirable.
>>> Listcomps and genexps are like lambdas: run up against their limits
>>> and you should switch to a regular for loop or generator.
>> I think of it not as limitation but as an odd gap in functionality. I
>> think having the semantics that the filtering is done after the
>> expression part would be much more useful than the current behavior
>> (filtering before expression).
>
> The point of the filtering is to avoid needlessly calculating a
> potentially expensive expression only to throw it away.
>
> If you want expression first, then filter, you can get that already in a
> one-liner:
>
> filter(lambda x: x > 0, [f(x) for x in seq])
>
> Don't create new syntax when there are perfectly good functions that do
> the job already.
That's ugly because of the same reason for using map():
[y for y in map(lambda x: f(x), seq) if y > 0]
or nested comprehension:
[y for y in (f(x) for x in seq) if y > 0]
More information about the Python-ideas
mailing list