By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,169 Members | 1,233 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,169 IT Pros & Developers. It's quick & easy.

"For" loop and list comprehension similarity

P: n/a
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
Share this Question
Share on Google+
10 Replies


P: n/a
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

P: n/a
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

P: n/a
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

P: n/a
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

P: n/a
> 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

P: n/a
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

P: n/a

<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

P: n/a
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

P: n/a
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

P: n/a

"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.