[Python-Dev] [UPDATE] PEP 274, Dict Comprehensions
Guido van Rossum
guido@python.org
Mon, 29 Oct 2001 14:08:17 -0500
> - There is one further shortcut we could adopt. Suppose we wanted
> to create a set of items, such as in the "list_of_email_addrs"
> example above. Here, we're simply taking the target of the for
> loop and turning that into the key for the dict comprehension.
Hm, I don't like this. I think it's confusing: you really have to
think about whether
{x for x in <whatever>}
produces a dictionary whose keys are in <whatever> or one whose values
are in <whatever>.
> - Should nested for loops be allowed? The following example,
> taken from an earlier revision of this PEP illustrates the
> problem:
>
> >>> print {k, v for k in range(4) for v in range(-4, 0, 1)}
Don't you mean {k: v for ...}? The second range() also seems like you
meant range(0, -4, -1).
> The intent of this example was to produce a mapping from a
> number to its negative, but this code doesn't work because -- as
> in list comprehensions -- the for loops are nested, not in
> parallel! So the value of this expression is actually
>
> {0: -1, 1: -1, 2: -1, 3: -1}
>
> which seems of dubious value. For symmetry with list
> comprehensions, perhaps this should be allowed, but it might be
> better to disallow this syntax.
Nested for loops can be useful when used properly:
{(k, v): k+v for k in range(4) for v in range(4)}
Your example should have been expressed using:
{k: v for k, v in zip(range(4), range(0, -4, -1))}
--Guido van Rossum (home page: http://www.python.org/~guido/)