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

Tarek Ziadé ziade.tarek at gmail.com
Wed Aug 27 18:51:41 CEST 2008


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)]

In my use case I would simply have to write;:

  [l.strip() as stripped for l in text.split('\n') if stripped != '']

Which seems to me clear and concise.


Tarek Ziadé | Association AfPy | www.afpy.org
Blog FR | http://programmation-python.org
Blog EN | http://tarekziade.wordpress.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20080827/97fbd3b4/attachment.html>

More information about the Python-ideas mailing list