Comprensión de listas
Cuatro líneas convertidas en una. Es lo que hace que el código de Python se vea como se ve.
List comprehensions
Four lines turned into one. It is what makes Python code look the way it does.
Supongamos que quieres una lista con el doble de cada número. Con lo que sabes lo harías así, y está perfecto:
Say you want a list with double each number. With what you know you would do it like this, and it is perfectly fine:
Cuatro líneas para algo muy simple: "para cada número, guarda su doble". Python tiene una forma de escribir exactamente esa frase.
Four lines for something very simple: "for each number, store its double". Python has a way to write exactly that sentence.
dobles = [ n * 2 for n in numeros ]
↑ ↑
qué guardar de dónde sacarlo
Se lee de derecha a izquierda: "para cada n en numeros… guarda n por 2". Los corchetes indican que el resultado es una lista.
doubles = [ n * 2 for n in numbers ]
↑ ↑
what to store where from
Read it right to left: "for each n in numbers… store n times 2". The brackets mean the result is a list.
Acá se pone realmente útil: puedes agregar un if al final para quedarte solo
con algunos.
Here it gets genuinely useful: you can add an if at the end to keep only some.
Si en vez de corchetes usas llaves y pones clave: valor, obtienes un
diccionario.
If instead of brackets you use braces and write key: value, you get a
dictionary.
Acá va la advertencia, porque es fácil pasarse. Las comprensiones son geniales cuando caben cómodas en una línea y se leen como una frase.
Cuando la lógica se complica, un bucle normal es mejor. Compara:
r = [x*2 if x%2==0 else x*3 for y in datos for x in y if x>0 and x<100]
Eso técnicamente funciona, pero nadie lo entiende — incluido tú dentro de dos semanas. Si te pasa, vuelve al bucle de toda la vida.
La regla: si tienes que detenerte a descifrarla, escríbela larga.
Here is the warning, because it is easy to overdo. Comprehensions are great when they fit comfortably on one line and read like a sentence.
When the logic gets complicated, a normal loop is better. Compare:
r = [x*2 if x%2==0 else x*3 for y in data for x in y if x>0 and x<100]
That technically works, but nobody understands it — including you in two weeks. If that happens, go back to the plain loop.
The rule: if you have to stop and decode it, write it out long.
Convertir un bucle en una línea, filtrar con if, hacer lo mismo con
diccionarios, y cuándo conviene no hacerlo.
Esta es la sintaxis que hace que el código de Python se reconozca a simple vista. Cuando la empieces a usar sin pensarlo, ya te acostumbraste al lenguaje.
Turning a loop into one line, filtering with if, doing the same with
dictionaries, and when not to.
This is the syntax that makes Python code recognisable at a glance. Once you use it without thinking, you have settled into the language.