Python nested list comprehensions syntax
Nested list comprehensions are a horrible idea because they are hard to parse, and I never understood them, BUT.1
python - How do I make a flat list out of a list of lists? - Stack Overflow has a discussion in the accepted answer about the suggested syntax to flatten lists, and I get it now.
flat_list = [
x
for xs in xss
for x in xs
]
# equivalent to
flat_list = []
for xs in xss:
for x in xs:
flat_list.append(x)
So,
[x for xs in xss for x in xs]
Comments:
I found the syntax hard to understand until I realized you can think of it exactly like nested for loops. for sublist in l: for item in sublist: yield item
[leaf for tree in forest for leaf in tree]
I kept looking here every time I wanted to flatten a list, but this gif is what drove it home: i.sstatic.net/0GoV5.gif
GIF IN QUESTION, after which it clicked for me:
The first element is the one that gets returned!
for tree in forest: for leaf in tree: return leaf
[leaf (for tree in forest, for leaf in tree)]
[leaf (for tree in forest for leaf in tree)]
[leaf for tree in forest for leaf in tree]
Found Understanding nested list comprehension syntax in Python — /var/ which expands on this, quoting PEP
It is proposed to allow conditional construction of list literals using for and if clauses. They would nest in the same way for loops and if statements nest now.
It then shows:
for x in non_flat:
if len(x) > 2
for y in x:
y
# equivaent to
>>> [ y for x in non_flat if len(x) > 2 for y in x ]
MIND. BLOWN.
I’m not sure “this requires you to understand Python syntax” is an argument against using a given technique in Python This is about
itertools.chain(*list
, which is the way to go imo. But still,*
is python syntax, otherwise there are more or less readable ways to do thigs and nested comprehensions are rarely worth it
-
From comment to another answer in that same question that shames me: ↩︎