
On Wed, Aug 27, 2008 at 12:51 PM, Tarek Ziadé <ziade.tarek@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