[Python-Dev] zip() and list-comprehension with commas
Ka-Ping Yee
ping@lfw.org
Wed, 12 Jul 2000 01:36:25 -0700 (PDT)
On Wed, 12 Jul 2000, Peter Schneider-Kamp wrote:
> +1 on this. no performance hit (probably a small gain),
> "zip" is imho the right name (see e.g. haskell).
Indeed, a nice coincidence. :)
> --------------------------------------------------------------------
>
> I know special character are evil, but in this case I think
> [<expr> | <clause>, <clause>, ...]
> would be on order of magnitude easier to read. Why not?
Alas, the vertical bar is already a bitwise-or operator, and
couldn't safely be placed next to the <expr>.
Hmm. How much of that "order of magnitude" comes from "|" looking
like the math notation, and how much from the mere fact that "|"
is distinguished from ","?
Semicolon might be worth considering here, actually: [f(x); for x in l]
> --------------------------------------------------------------------
>
> Would [x,y , for x in list1, if x > 1, if y > 2, for y in list2]
> be allowed? In other words: Should there be some rules of ordering?
> What would the above list comprehension produce for
> list1 = list2 = [1, 2, 3]?
I would say raise SyntaxError on this example.
Also, the way you've written the example would depend on an
existing variable named 'y' because you put "if y > 2" outside
of "for y in list2". If the existing variable was <= 2, you'd
get an empty list. For the following, i'm assuming you intended
to put "if y > 2" last.
As for the SyntaxError, i think it's a good idea because the
example could be ambiguous. You would have to either say
[(x, y), for x in list1, if x > 1, for y in list2, if y > 2]
or
[x] + [y, for x in list1, if x > 1, for y in list2, if y > 2]
The first would produce [(2, 3), (3, 3)], and the second would
depend on the initial value of x and look like [x, 3, 3].
> --------------------------------------------------------------------
>
> Would the following be allowed (and desirable)?
> y = 3
> [ x + y , for x in [1, 2, 3], if x > 1]
> producing [5, 6]
Absolutely.
> --------------------------------------------------------------------
>
> I don't know Python's parser, so I am sorry if this is a non-issue:
> How does it resolve the ambiguity between
> [<expr>, <expr>, ...] and [<expr>, <clause>, <clause>, ...]?
> Especially something like
> [x, y, z, for x in l1, for y in l2, for z in l3] concerns me.
I guess it depends how the argument about parens-around-tuples
finally resolves, but personally i'd say that more than one expr
before an attempted iteration clause should cause a SyntaxError.
It would have to be written:
[(x, y, z), for x in l1, for y in l2, for z in l3]
-- ?!ng