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

Terry Reedy tjreedy at udel.edu
Tue Jan 29 19:53:59 CET 2013


On 1/29/2013 10:02 AM, Rob Cliffe wrote:
>> On 29/01/2013 10:44, Nick Coghlan wrote:
>> Terry is correct: comprehensions are deliberately designed to have the
>> exact same looping semantics as the equivalent statements flattened
>> out into a single line, with the innermost expression lifted out of
>> the loop body and placed in front. This then works to arbitrarily deep
>> nesting levels. The surrounding syntax (parentheses, brackets, braces,
>> and whether or not there is a colon present in the main expression)
>> then governs what kind of result you get (generator-iterator, list,
>> set, dict).
>>>> For example in:
>>>> (x, y, z for x in a if x for y in b if y for z in c if z)
>> [x, y, z for x in a if x for y in b if y for z in c if z]
>> {x, y, z for x in a if x for y in b if y for z in c if z}
>> {x: y, z for x in a if x for y in b if y for z in c if z}
>>>> The looping semantics of these expressions are all completely defined
>> by the equivalent statements:
>>>> for x in a:
>> if x:
>> for y in b:
>> if y:
>> for z in c:
>> if z:
>>>> (modulo a few name lookup quirks if you're playing with class scopes)
>>> Thanks for spelling this out so clearly. It helps me remember which
> order to place nested "for"s inside a list comprehension! :-)

The reference manual does spell it out: "In this case, the elements of 
the new container are those that would be produced by considering each 
of the for or if clauses a block, nesting from left to right, and 
evaluating the expression to produce an element each time the innermost 
block is reached." Perhaps a non-trivial concrete example (say 4 levels 
deep) would help people understand that better.
-- 
Terry Jan Reedy


More information about the Python-ideas mailing list

AltStyle によって変換されたページ (->オリジナル) /