A week ago, @alex_gaynor tweeted a quick listcomp for flattening a two-dimensional matrix (list of lists):
@garybernhardt [y for x in LIST for y in x]. ONE TRUE WAY.
— Alex Gaynor (@alex_gaynor) November 2, 2011
At the time, I thought it was cool, but I didn’t really “get” the “how”. But now I do.
Say we have the following matrix:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
The flattening looks like this:
>>> [x for y in matrix for x in y]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
PEP 202 states:
- The form [… for x… for y…] nests, with the last index varying fastest, just like nested for loops.
Most list comps take the form a = [b(c) for c in d if e]
. If each level of logic nests, this is equivalent to:
a = []
for c in d:
if e:
a.append(b(c))
So, following this logic, multiple for ...
clauses in the matrix-flattening are simply nested loops:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
flattened = [x for y in matrix for x in y]
flattened = []
for y in matrix:
for x in y:
flattened.append(x)