[Python-ideas] More power in list comprehensions with the 'as' keyword

George Sakkis george.sakkis at gmail.com
Wed Aug 27 20:05:01 CEST 2008


On Wed, Aug 27, 2008 at 12:51 PM, Tarek Ziadé <ziade.tarek at gmail.com> wrote:

> Hello
>
> There's a pattern I am doing all the time: filtering out some elements of a
> list, and cleaning them in the same move.
>
> For example, if I have a multi line text, where I want to:
>
> - keep non empty lines
> - clean non empty lines
>
> I am doing:
>
>     >>> text = """
>     ... this is a multi-line text\t
>     ...
>     ... \t\twith
>     ...
>     ... muliple lines."""
>
>     >>> [l.strip() for l in text.split('\n') if l.strip() != '']
>     ['this is a multi-line text', 'with', 'muliple lines.']
>
> It is not optimal, because I call strip() twice. I could use ifilter then
> imap or even use a real loop, but I
> want my simple, concise, list comprehension !  And I couldn't find a simple
> way to express it.
>
> The pattern can be generically resumed like this :
>
>    [transform(e) for e in seq if some_test(transform(e))]
>
> So what about using the 'as' keyword to extend lists comprehensions, and
> to avoid calling transform() twice ?
>
> Could be:
>
>    [transform(e) as transformed for e in seq if some_test(transformed)]
>

-1; not general enough to justify the extra overhead (both in human mental
effort and compiler changes), given that the current alternatives (esp.
genexps) are already quite readable and more flexible.

George
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20080827/26c85c27/attachment.html>


More information about the Python-ideas mailing list