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]