Objetivo: introducir formalmente una técnica poderosa para la creación y modificación de listas: las listas por comprensión.
En un artículo reciente presentamos varios modos de abordar la necesidad de modificar una lista iterando sobre ella.
Échale un vistazo para situarte en contexto si no lo recuerdas; te llevará apenas un minuto.
Tras presentar las técnicas de modificación con la creación de una nueva lista temporal y mediante el acceso a través del índice, soltamos, a modo de aperitivo, un bombazo en perfecto estilo pythonesco:
>>> lista = [1, 2, 3, 4, 5]
>>> lista = [elemento * elemento for elemento in lista]
>>> lista
[1, 4, 9, 16, 25]
Nos ha bastado una única instrucción para transformar la lista por otra con sus elementos elevados al cuadrado.
Las listas por comprensión no sólo suponen un modo más elegante y rápido de escribir código, sino que además se ejecutan más rápidamente también, al estar implementadas directamente en lenguaje C.
Supongamos que tenemos una lista compuesta de cadenas de caracteres que queremos transformar en mayúsculas:
>>> alioli = ['ajo', 'aceite']
Para generar la lista por comprensión procedemos del siguiente modo:
1) Escribimos una iteración que recorra la lista:
for s in alioli
2) Agregamos a la izquierda lo que queremos que suceda con cada elemento:
s.upper() for s in alioli
3) Finalmente, rodeamos toda la expresión entre corchetes:
[s.upper() for s in alioli]
Observémoslo en acción:
>>> [s.upper() for s in alioli]
['AJO', 'ACEITE']
Es muy importante comprender que este procedimiento no modifica la lista original, que mantiene su valor.
>>> alioli
['ajo', 'aceite']
Se ha creado, por el contrario, un nuevo objeto lista que podría ser referenciado por cualquier otra variable.
Por supuesto, si lo que deseábamos era transformar la lista original podríamos haber hecho directamente la siguiente asignación:
>>> alioli = [s.upper() for s in alioli]
Ahora sí: alioli está referenciando la nueva lista por comprensión generada en lugar de la antigua:
>>> alioli
['AJO', 'ACEITE']
Una señora salsa en mayúsculas…
La iteración podemos realizarla sobre cualquier estructura susceptible de ser iterada, no necesariamente sobre una lista.
El siguiente ejemplo toma una cadena de caracteres y construye una lista con el código de cada carácter individual de la cadena:
>>> s = 'Me tomaría ahora una buena ración de papas al alioli'
>>> codigos = [ord(caracter) for caracter in s]
>>> codigos
[77, 101, 32, 116, 111, 109, 97, 114, 237, 97, 32, 97, 104, 111,
114, 97, 32, 117, 110, 97, 32, 98, 117, 101, 110, 97, 32, 114,
97, 99, 105, 243, 110, 32, 100, 101, 32, 112, 97, 112, 97, 115,
32, 97, 108, 32, 97, 108, 105, 111, 108, 105]
Como ejercicio te propongo que realices la misma operación empleando la metodología tradicional.
Me ha entrado mucha hambre escribiendo esto, de modo que continuaremos hablando otro día de las listas por comprensión y presentaremos una nueva sintaxis ampliada que las hará más potentes aún.
Javier Montero Gabarró
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
Consulta el índice completo de artículos relacionados con Python.
Excelente, muchas gracias !!!
Gracias a tu artículo pude comprender esta característica de Python, Saludos,
Me alegro de que te haya servido.
Saludos
Chulada de explicación!
Ea, me alegro de que te haya gustado. 🙂
Saludos
Hola. Muchas gracias por este blog.
Tengo una duda con las listas por compresion que no termino de entender, vengo de PHP.
Si tengo una lista [1,2]
y quiero cambiar el valor 1 por otro valor
puedo usar una lista por compresion?
algo asi?
nueva_lista= [i for i in lista if i==1]
Excelente explicación sigue así
### No es muy elegante pero cumple el objetivo.
contenedor = []
for caracter in s:
#print(caracter)
box = ord(caracter)
contenedor.append(box)
contenedor
Excelente explicación, me tenia un poco confundido el flujo de derecha a izquierda, cuando las vi por primera vez intente asociarla con los pipelines de linux
Muy buena explicación, ahora con la segunda parte. Felicidades!