Suggestion for impriving list comprehensions
Mark Day
mday at apple.com
Thu Jul 26 21:09:21 EDT 2001
In article <cpofq75qax.fsf at cj20424-a.reston1.va.home.com>, Guido van
Rossum <guido at python.org> wrote:
> paul at svensson.org (Paul Svensson) writes:
>
> > I would like to suggest that we add a "while condition" clause
> > to list comprehensions, similar to the "if condition" clause,
> > but terminating the list comprehension on the first false condition.
> > The above example could then be written as
> >
> > [x for x in fib() while x < 50]
>
> Neat, but maybe not general enough. How do you request the first N?
[x[0] for x in zip(fib(),xrange(N))]
or
[x for x in fib()][:N]
assuming it's smart enough to stop iterating when the slice has been
produced. I guess the list comprehension would have to be a form of
iterator/generator, and slices would have to stop iterating when they
get all the elements they need. Would this work in 2.2a1?
> And fuzzy: does this include or exclude the first x >= 50?
I would have assumed it would exclude the first x >= 50. But then I
tend to think in C and prefer while(){} over do{}while().
Consider:
>>> [3*i for i in xrange(10) if (i%2)==0]
[0, 6, 12, 18, 24]
When I see that list comprehension, I think of it as something like:
for i in xrange(10):
if (i%2)==0:
yield 3*i
or
temp = iterator(xrange(10))
while 1:
i = temp.next()
if i%2==0:
yield 3*i
where the while loop terminates when temp returns an exception.
So, [x for x in fib() while x < 50] would be something like:
while (x=fib.next()) < 50:
yield x
I'm using C notation to express combined assignment and condition test.
But that's because that concept is a little more cumbersome to express
in Python (and why it would be great in list comprehensions). I
suppose the Pythonic way would be something like:
x = fib.next()
while x<50:
yield x
x = fib.next()
-Mark
More information about the Python-list
mailing list