Multiple items for each loop in comprehension

How about allowing to create multiple items for each loop in comprehension? I'm not sure this grammar is available, though. for example: [loop for set] s = set() for i in range(10): s.add(i) s.add(i * 10) [current comprehension] s = { x for i in range(10) for x in (i, i * 10) } [suggested comprehension] s = { i, i * 10 for i in range(10) } [loop for dict] dic = {} for i in range(10): dic[i] = i * 10 dic[i * 10] = i [current comprehension] dic = { k: v for i in range(10) for k, v in ((i, i * 10), (i * 10, i)) } [suggested comprehension] dic = { i: i * 10, i * 10: i for i in range(10) }

On Sep 21, 2019, at 01:03, 보성 최 <cbscsm@gmail.com> wrote:
Is there a reason it has to be a single comprehension? I think this would be a lot more readable: s = {x for x in range(10)} | {x*10 for x in range(10)} This doesn’t work as well for list comprehensions, or generator expressions, but it’s still not too horrible with a trivial interleave (flattened-zip) function: it = interleave((x for x in range(10)), (x*10 for x in range(10))) Which brings up another possibility: just build tuples and flatten: s = set(flatten((x, x*10) for x in range(10)) If you want, you could even make that a single flatten-and-setify function: def fset(It): return { x for tup in it for x in tup } s = fset((x, x*10) for x in range(10)) That’s still not quite as readable as your suggestion, but it’s not that bad, and it’s already available.
I think you could find a way to make this not ambiguous as far as the parser is concerned, but it might be confusing for human readers. Remember that you can have a tuple as the yield expression, or you could have i as one element and a generator expression as the second, and possibly other things. I think all such other things would require an extra set of parens in every possible case, so the parser doesn’t have to do any extra look ahead or anything, but I think most humans don’t internalize the exact rules for when tuples do and don’t require parens, etc.

On Sep 21, 2019, at 01:03, 보성 최 <cbscsm@gmail.com> wrote:
Is there a reason it has to be a single comprehension? I think this would be a lot more readable: s = {x for x in range(10)} | {x*10 for x in range(10)} This doesn’t work as well for list comprehensions, or generator expressions, but it’s still not too horrible with a trivial interleave (flattened-zip) function: it = interleave((x for x in range(10)), (x*10 for x in range(10))) Which brings up another possibility: just build tuples and flatten: s = set(flatten((x, x*10) for x in range(10)) If you want, you could even make that a single flatten-and-setify function: def fset(It): return { x for tup in it for x in tup } s = fset((x, x*10) for x in range(10)) That’s still not quite as readable as your suggestion, but it’s not that bad, and it’s already available.
I think you could find a way to make this not ambiguous as far as the parser is concerned, but it might be confusing for human readers. Remember that you can have a tuple as the yield expression, or you could have i as one element and a generator expression as the second, and possibly other things. I think all such other things would require an extra set of parens in every possible case, so the parser doesn’t have to do any extra look ahead or anything, but I think most humans don’t internalize the exact rules for when tuples do and don’t require parens, etc.
participants (2)
-
Andrew Barnert
-
보성 최