Anidación de bucles

De hecho, podríamos incluir varias sentencias for y varias sentencias if en la "list comprehension". Por ejemplo:

cities = ["Madrid", "Barcelona", "Milán", "Santander"]
years = [2017, 2018, 2019, 2020]

[(c, y) for c in cities for y in years]

[('Madrid', 2017),
 ('Madrid', 2018),
 ('Madrid', 2019),
 ('Madrid', 2020),
 ('Barcelona', 2017),
 ('Barcelona', 2018),
 ('Barcelona', 2019),
 ('Barcelona', 2020),
 ('Milán', 2017),
 ('Milán', 2018),
 ('Milán', 2019),
 ('Milán', 2020),
 ('Santander', 2017),
 ('Santander', 2018),
 ('Santander', 2019),
 ('Santander', 2020)]

Comprobamos que el resultado es equivalente al devuelto por el siguiente código:

a = []
for c in cities:
    for y in years:
        a.append((c, y))
a

[('Madrid', 2017),
 ('Madrid', 2018),
 ('Madrid', 2019),
 ('Madrid', 2020),
 ('Barcelona', 2017),
 ('Barcelona', 2018),
 ('Barcelona', 2019),
 ('Barcelona', 2020),
 ('Milán', 2017),
 ('Milán', 2018),
 ('Milán', 2019),
 ('Milán', 2020),
 ('Santander', 2017),
 ('Santander', 2018),
 ('Santander', 2019),
 ('Santander', 2020)]

Por supuesto, podríamos anidar tantos bucles como quisiéramos:

[(a, b, c, d) for a in ["a1", "a2"] for b in ["b1", "b2"] for c in ["c1", "c2"] for d in ["d1", "d2"]]

[('a1', 'b1', 'c1', 'd1'),
 ('a1', 'b1', 'c1', 'd2'),
 ('a1', 'b1', 'c2', 'd1'),
 ('a1', 'b1', 'c2', 'd2'),
 ('a1', 'b2', 'c1', 'd1'),
 ('a1', 'b2', 'c1', 'd2'),
 ('a1', 'b2', 'c2', 'd1'),
 ('a1', 'b2', 'c2', 'd2'),
 ('a2', 'b1', 'c1', 'd1'),
 ('a2', 'b1', 'c1', 'd2'),
 ('a2', 'b1', 'c2', 'd1'),
 ('a2', 'b1', 'c2', 'd2'),
 ('a2', 'b2', 'c1', 'd1'),
 ('a2', 'b2', 'c1', 'd2'),
 ('a2', 'b2', 'c2', 'd1'),
 ('a2', 'b2', 'c2', 'd2')]

En estos casos resulta imprescindible especificar la estructura que van a tener los bloques generados. En los ejemplos anteriores se trata de tuplas, pero podría ser otro tipo de estructura:

[[c, y] for c in cities for y in years]

[['Madrid', 2017],
 ['Madrid', 2018],
 ['Madrid', 2019],
 ['Madrid', 2020],
 ['Barcelona', 2017],
 ['Barcelona', 2018],
 ['Barcelona', 2019],
 ['Barcelona', 2020],
 ['Milán', 2017],
 ['Milán', 2018],
 ['Milán', 2019],
 ['Milán', 2020],
 ['Santander', 2017],
 ['Santander', 2018],
 ['Santander', 2019],
 ['Santander', 2020]]

No se permite en ningún caso algo como lo siguiente:

[c, y for c in cities for y in years]