[Python-ideas] while conditional in list comprehension ??
Wolfgang Maier
wolfgang.maier at biologie.uni-freiburg.de
Mon Jan 28 17:48:07 CET 2013
> Sarcasm will not help your argument. The difference (as I would expect you
to know) between the performance of a list comprehension and an
> explict `for` loop is significant and the comprehension is already a
feature of the language. Removing it would be nonsensical.
Ok, I am sorry for the sarcasm. Essentially this is exactly what I wanted to
say with it. Because comprehensions are faster than for loops, I am using
them, and this is why I'd like the while feature in them. I fully agree with
everybody here that itertools provides a solution for it, but imagine for a
moment the if clause wouldn't exist and people would point you to a similar
itertools solution for it, e.g.:
[n for n in itertools.takeif(lambda n: n % 4 == 0, range(1,1000))]
What would you prefer?
I think it is true that this is mostly about how often people would make use
of the feature.
And, yes, it was a mistake to disturb the ongoing voting with sarcasm.
Best,
Wolfgang
> Since the question of use cases was brought up: I am working as a
> scientist, and one of the uses I thought of when proposing this was
> that it could be used in combination with any kind of iterator that
> can yield an infinite number of elements, but you only want the first
> few elements up to a certain value (note: this is related to, but not
> the same as saying I want a certain number of elements from the iterator).
>
> Let´s take the often used example of the Fibonacci iterator and assume
> you have an instance 'fibo' of its iterable class implementation, then:
>
> [n for n in fibo while n <10000]
>
> would return a list with all Fibonacci numbers that are smaller than
> 10000 (without having to know in advance how many such numbers there are).
> Likewise, with prime numbers and a 'prime' iterator:
>
> [n for n in prime while n<10000]
>
> and many other scientifically useful numeric sequences.
> I would appreciate such a feature, and, even though everything can be
> solved with itertools, I think it´s too much typing and thinking for
> generating a list quickly.
>
This is definitely a problematic use case for a simple list comprehension,
but the takewhile solution works exactly as expected and even resembles your
solution. It is in the standard library and it's performance seems to be
fast enough (to me at least, on a 10 year old laptop). And the key phrase
here is "simple list comprehension".
Yours is in theory a simple list comprehension but is rather a slightly more
complex case that can be handled in a barely more complex way. itertools is
a part of the standard library that needs more affection, in my opinion and
really does its best to accommodate these more complex cases in sensible
ways.
I am still -1 on this.
Cheers,
Ian
More information about the Python-ideas
mailing list