470,849 Members | 697 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,849 developers. It's quick & easy.

"For" loop and list comprehension similarity

Hi All,

I apologize if this was brought up before, I couldn't find any "prior
art" :-).
On more than one occasion, I found myself wanting to use a "conditional
loop" like this (with "Invalid syntax" error, of course):

for i in c if <test>:
print i*2

....because it's similar to the list comprehension construct:

[i*2 for i in c if <test>]
---------

Is this the intended difference in constructs? The available equivalent
feels a bit awkward:

for i in c:
if <test>:
print i*2

Just curious. Thanks!

Sergey.

Mar 26 '06 #1
10 1525
s.*********@gmail.com wrote:
On more than one occasion, I found myself wanting to use a "conditional
loop" like this (with "Invalid syntax" error, of course):

for i in c if <test>:
print i*2
Maybe there's been a PEP, don't really know...
Currently, the only sensible alternative is what you've written below:
The available equivalent
feels a bit awkward:

for i in c:
if <test>:
print i*2

This indeed doesn't look nice, especially if you've got lots of code instead of just
print. An alternative which avoids double indentation is

for i in c:
if not <test>: continue
print i*2
Mar 26 '06 #2
Thank you for replying, Mitja! That *is* a nice alternative.

Do you think it's a good idea to ask on comp.python.devel if they would
be interested in a PEP about this (provided there is none)?

Cheers,
Sergey.

Mar 26 '06 #3
On 2006-03-26, s.*********@gmail.com <s.*********@gmail.com> wrote:
Hi All,

I apologize if this was brought up before, I couldn't find any "prior
art" :-).
On more than one occasion, I found myself wanting to use a "conditional
loop" like this (with "Invalid syntax" error, of course):

for i in c if <test>:
print i*2

...because it's similar to the list comprehension construct:

[i*2 for i in c if <test>]
---------

Is this the intended difference in constructs? The available equivalent
feels a bit awkward:

for i in c:
if <test>:
print i*2


for j in [i*2 for i in c if <test>]:
print j

--
Grant Edwards grante Yow! .. I wonder if I
at ought to tell them about my
visi.com PREVIOUS LIFE as a COMPLETE
STRANGER?
Mar 26 '06 #4
s.*********@gmail.com writes:
On more than one occasion, I found myself wanting to use a "conditional
loop" like this (with "Invalid syntax" error, of course):

for i in c if <test>:
print i*2

...because it's similar to the list comprehension construct:

[i*2 for i in c if <test>]


Why not combine the two:

for i in [j for j in c if <test>]:
print i*2

--
\ "I got food poisoning today. I don't know when I'll use it." |
`\ -- Steven Wright |
_o__) |
Ben Finney

Mar 26 '06 #5
> Why not combine the two:

I guess because (at least in source code) you're doing a loop twice
:-). I don't know what a compiler would do. I think though that the
"for i in c if test:" construct is more readable and maybe can even be
better optimized.
Thanks!

Sergey.

Mar 26 '06 #6
Rather than a list comprehension, it would be faster and more
memory-efficient to use a generator comprehension. Just change the
square brackets to parentheses:

for j in (i*2 for i in c if <test>):
print j
Grant Edwards wrote:
On 2006-03-26, s.*********@gmail.com <s.*********@gmail.com> wrote:
Hi All,

I apologize if this was brought up before, I couldn't find any "prior
art" :-).
On more than one occasion, I found myself wanting to use a "conditional
loop" like this (with "Invalid syntax" error, of course):

for i in c if <test>:
print i*2

...because it's similar to the list comprehension construct:

[i*2 for i in c if <test>]
---------

Is this the intended difference in constructs? The available equivalent
feels a bit awkward:

for i in c:
if <test>:
print i*2

for j in [i*2 for i in c if <test>]:
print j

Mar 26 '06 #7

<s.*********@gmail.com> wrote in message
news:11**********************@j33g2000cwa.googlegr oups.com...
Why not combine the two:


I guess because (at least in source code) you're doing a loop twice
:-). I don't know what a compiler would do. I think though that the
"for i in c if test:" construct is more readable and maybe can even be
better optimized.


There are also the filter and ifilter functions:

for i in filter(testfunc, c):

tjr

Mar 27 '06 #8
I think I like generator comprehension in this case better than either
list comprehension or a filter because both of the latter create a new
full "result list" before the loop even begins. At least I suppose they
do. Also, I think Mitja's suggestion "if not <test>: continue" and
Terry's filter function are more readable than comprehensions.
It's not a contest though :-), all these variants are great, thank you
all!
Do you think this discussion is a proof that the following principle
got violated, or do you think that "loop with condition" is not such an
atomic thing to be subject to this: "There should be one -- and
preferably only one -- obvious way to do it."
Cheers,

Sergey.

Mar 27 '06 #9
s.*********@gmail.com wrote:
Do you think this discussion is a proof that the following principle
got violated, or do you think that "loop with condition" is not such an
atomic thing to be subject to this: "There should be one -- and
preferably only one -- obvious way to do it."


Mitja's suggestion was the one obvious way. The others are all
interesting, maybe even preferable in some cases, but I don't think most
experienced Python programmers would be more likely to start with one of
them than with the simple for-loop-with-explicit-test.

-Peter

Mar 27 '06 #10

"Peter Hansen" <pe***@engcorp.com> wrote in message
news:e0**********@sea.gmane.org...
s.*********@gmail.com wrote:
Do you think this discussion is a proof that the following principle
got violated, or do you think that "loop with condition" is not such an
atomic thing to be subject to this: "There should be one -- and
preferably only one -- obvious way to do it."


Mitja's suggestion was the one obvious way. The others are all
interesting, maybe even preferable in some cases, but I don't think most
experienced Python programmers would be more likely to start with one of
them than with the simple for-loop-with-explicit-test.


If by 'explicit-test' you mean a nested if-statement, then I agree. When I
mentioned filter() as one way to avoid the obvious, I was aware that it
creates an intermediate list that is usually not needed. (And if it is
needed, then it should be name-assigned before the loop.)

Terry Jan Reedy

Mar 27 '06 #11

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

23 posts views Thread by Invalid User | last post: by
11 posts views Thread by David Morgenthaler | last post: by
32 posts views Thread by Toby Newman | last post: by
3 posts views Thread by songie D | last post: by
4 posts views Thread by Jacob Rael | last post: by
34 posts views Thread by Frederick Gotham | last post: by
8 posts views Thread by Ratko | last post: by
9 posts views Thread by Alexnb | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.