[Python-ideas] while conditional in list comprehension ??

Terry Reedy tjreedy at udel.edu
Tue Jan 29 00:27:08 CET 2013


On 1/28/2013 8:33 AM, Wolfgang Maier wrote:
> Dear all,
> I guess this is so obvious that someone must have suggested it before:

No one who understands comprehensions would suggest this.

> in list comprehensions you can currently exclude items based on the if
> conditional, e.g.:
>
> [n for n in range(1,1000) if n % 4 == 0]
>
> Why not extend this filtering by allowing a while statement in addition to
> if, as in:

Why not? Because it is flat-out wrong. Or if you prefer, nonsensical. 
You want to break, not filter; and you are depending on the order of the 
items from the iterator. Comprehensions are a math-logic idea invented 
for (unordered) sets and borrowed by computer science and extended to 
sequences. However, sequences do not replace sets.

https://en.wikipedia.org/wiki/Set-builder_notation
https://en.wikipedia.org/wiki/List_comprehension

Python has also extended the idea to dicts and iterators and uses almost 
exactly the same syntax for all 4 variations.

> [n for n in range(1,1000) while n < 400]

This would translate as

def _temp():
   res = []
   for n in range(1, 1000):
     while n < 400):
       res.append(n)
   return res
_temp()

which makes an infinite loop, not a truncated loop.
What you actually want is

   res = []
   for n in range(1, 1000):
     if >= 400): break
     res.append(n)

which is not the form of a comprehension.

-- 
Terry Jan Reedy




More information about the Python-ideas mailing list