Listas y dicc por comprensión: operaciones usando bucle for, Ejemplos!

Anteriormente habíamos visto los métodos que nos permitían trabajar con listas y tuplas, en esta entrada vamos a aprender a crear iterables por comprensión, ya sean listas, diccionarios, cadenas.

 

Listas por comprensión

Las listas, tuplas, diccionarios son como dijimos antes conjuntos y estos surgen de la agrupación, ya sea por extensión o por comprensión.

Cuando agrupamos elementos por extensión cada elemento se enumera de manera explícita, es decir, se define uno por uno cada elemento que pertenece al grupo.

En cambio, cuando agrupamos elementos por comprensión lo hacemos sin definir uno por uno los elementos sino que los agrupamos por una propiedad en común.

Podemos crear una lista por extensión o por comprensión:

 

 

Cómo ves el resultado será el mismo, la diferencia es que la lista por comprensión fue creada a partir de la propiedad en común (ser pares) de los números en rango de 0 a 9 iterandolos para descartar aquellos que no cumplen la condición de ser divisibles por 2 con resto cero.

Si separamos el código y lo miramos atentamente vamos a ver que almacena en la lista “a”:

Primeramente se almacena en la variable “x” un rango de números del 0 al 9 y se itera cada uno. Luego presentando una condición if se expone que sólo se almacenarán aquellos cuya división por dos de resto 0.

Aprender a crear listas por comprensión nos va a permitir modificar una lista iterando sobre ella y aplicando ciertos filtros o condiciones, lo que nos presentara una elegante ventaja!

 

Sintaxis

La sintaxis para crear listas por comprensión consta de colocar entre corchetes una expresión seguida de la cláusula for para iterar y luego puede ir una condición para filtrar los resultados finales. Las listas por comprensión no modifican una lista existente sino que crean una nueva, en algunos casos temporal.

Venga, creemos algunas listas por comprensión a modo de ejemplo mientras exploramos su sintaxis!

Resultado: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Esto podría interpretarse como que estamos creando una lista llamada ListaCuadrados que contiene: la expresión x elevada al cuadrado para el elemento x de un rango de 0 a 10. Al realizar un bucle for se aplica el cuadrado para cada elemento generado por range.

Normalmente se coloca a la izquierda la expresión (transformación) a realizar y a la derecha la condición.

 

Crear listas a partir de otra lista

Podemos iterar una lista (así como cualquier iterable) creada anteriormente para extraer una nueva aplicando diversos filtros para lograr un objetivo específico, supongamos que tenemos una lista de nombres y queremos extraer aquellos cuyas iniciales sean vocales.

 

 

Resultado: [‘Alberto’, ‘Exequiel’, ‘Alejandro’, ‘Antonio’, ‘Omar’, ‘Antonia’, ‘Amalia’, ‘Anabela’]

Para comprobar todas las vocales me fue necesario crear una lista aparte con las mismas, entonces se podría interpretar el código de la lista Nombresvocales como: nombre para nombre en la lista “Nombres” si el índice0” de la iteración de cada “nombre” (elemento de la lista) se encuentran (in) en la lista vocales.

El bucle for recorre cada letra de cada elemento de la lista comparándolo con cada elemento de la lista vocales.

Puede parecer difícil de realizar al principio pero una vez que aprendemos como funciona el bucle for es cuestión de ir probando, a veces no sale a la primera 🙂

La mejor forma de aprender a iterar listas, cadenas o diccionarios es realizando ejercicios que me gustaría plantear en las siguientes entradas.

El código anterior es igual al siguiente:

 

 

Resultado: [‘Alberto’, ‘Exequiel’, ‘Alejandro’, ‘Antonio’, ‘Omar’, ‘Antonia’, ‘Amalia’, ‘Anabela’]

En este otro código hacemos realmente lo mismo pero debemos primero crear la lista vacía donde irán los elementos que cumplan la condición: Nombresvocales y luego los añadimos a ella.

Esta segunda forma de hacerlo te permitirá comprender un poco mejor lo que hicimos en la primera, al no estar todo en una sola línea resulta más comprensible, pero si te fijas bien es básicamente lo mismo. Puedes intentar hacerlo de la segunda manera y luego tratar de traducir el código a la primera lo que te permitirá aprender a simplificar el código y pensarlo desde el punto correcto.

Ejemplo

Vamos a tratar de separar nuestra lista de nombres en dos listas una para los masculinos y otra para los femeninos, suponiendo que los nombres femeninos terminan en “a” y “e” en nuestro caso.

Para eso podemos utilizar casi el mismo código que usamos anteriormente pero cambiando el índice que comprobamos de [0] a [-1] para comprobar siempre la última letra de cada nombre.

 

 

Resultado: 

[‘Tamara’, ‘Antonia’, ‘Amalia’, ‘Daniela’, ‘Sofia’, ‘Celeste’, ‘Jorgelina’, ‘Anabela’]
——————-
[‘Marcelo’, ‘Martin’, ‘Juan’, ‘Alberto’, ‘Exequiel’, ‘Alejandro’, ‘Leonel’, ‘Antonio’, ‘Omar’, ‘Ramon’]

 

Ahora hagámoslo como explicamos anteriormente creando directamente las listas mediante for.

 

 

Resultado: 

[‘Tamara’, ‘Antonia’, ‘Amalia’, ‘Daniela’, ‘Sofia’, ‘Celeste’, ‘Jorgelina’, ‘Anabela’]
——————-
[‘Marcelo’, ‘Martin’, ‘Juan’, ‘Alberto’, ‘Exequiel’, ‘Alejandro’, ‘Leonel’, ‘Antonio’, ‘Omar’, ‘Ramon’]

 

Como ves funciona perfectamente y lo único que hicimos fue meter el mismo código dentro de la lista. También en laLista a partir de otra lista por comprensión primera lista podríamos haber colocado un else y un append para añadir directamente aquellos que no cumplan la condición a la lista de masculinos, pero preferí hacer otro bucle for para ejemplificar.

En un ejemplo real suponiendo que tuviéramos 2000 nombres en una lista y alguno se escapa a la condición de terminar en ‘a’ o ‘e’ podríamos mediante un else separarlos en una lista indefinida, para luego revisar y modificar nuestras condiciones.

 

 

Condicionales de comprobación (All / Any)

Hay algo más que aún no hemos visto que podríamos utilizar perfectamente para comprobar datos de listas, cadenas y diccionarios. All y any nos van a permitir determinar si todos (all) o algunos / ninguno (any) elementos de una lista devuelve True ante tal condición.

Sintaxis

 

Ejemplo

Supongamos en un ejemplo en el que le pedimos a un usuario que ingrese elementos para añadir a una lista y luego debemos comprobar si dichos elementos cumplen la condición. En este caso le solicitamos al usuario ingrese tres números mayores a 5 y menores a 10.

 

-Nosotros queremos que el usuario ingrese 3 números para almacenarlos en una lista

-Si todos los números son mayores o igual a 5 y menores o igual a 10 nos de un OK

-En caso que algún número no sea mayor o igual a 5 y no sea menor o igual a 10 nos dispare un aviso y volvamos a intentar.

-Si ningún número cumple ninguna de las condiciones anteriores, terminar el programa.

Venga ese code cabron

-Venga ese code cabrón!!

 

 

 

 

 

Resultados:

Ingresando: 5 , 6, 7

Correcto! Los números ingresados son mayores a 5 y menores a 10

Ingresando: 5, 6, 3

Algún número no es correcto

Vuelve a intentarlo

Ingresando: 12, 15, 3

Error no has ingresado ningún numero mayor a 5 o menor a 10

Suerte la próxima perdedor, ni siquiera un solo numero!

 

Nuestro programa funciona como la seda, pero hay que destacar que la condición que comprueba si son mayores o iguales a 5 y menores o iguales a 10 debimos colocarla a la izquierda del bucle for para que sea posible la correcta comprobación de All / Any.

All / any nos serán muy útiles cuando todos los elementos de la lista o iterable deben cumplir una condición en común.

 


 

Creando diccionarios por comprensión usando dict()

 

Diccionarios por comprensiónAhora vamos a trabajar con diccionarios, uff te debo tener la cabeza más cansada que un bucle infinito! jaja pero venga que está que arde!

-Vamos a crear un diccionario por comprensión utilizando dict y bucle for

-Vamos a aprender a convertir listas en un diccionario

-Agregaremos elementos al diccionario con input

Anteriormente en bucles for habíamos visto cómo iterar un diccionario existente pero si deseamos crear un diccionario por comprensión, el código sería el siguiente:

 

Resultado:

{1: 1, 2: 4, 3: 9, 4: 16}

En este caso estamos creando un diccionario usando dict seguido de un bucle for que especifica en este caso “x” como (key) y “x * x” cómo (value) para cada elemento (“x”) en “1,2,3,4”. Entonces vemos como key sucesivas 1, 2, 3 ,4 y como valores su cuadrado respectivo 1, 4, 9, 16.

 

 

Creando diccionarios a partir de Listas con bucle for

Vamos a ver como crear un diccionario a partir de una lista, pero presta especial atención a esta lista:

 

Resultado:

{‘hola’: ‘python’}

 

Como vemos hemos creado un nuevo diccionario a partir de una lista utilizando un bucle for, pero hay un detalle importante en cuanto a la lista, esta no puede ser una lista común! Debe estar organizada de manera que facilite la creación de un diccionario (cada elemento de la lista es una tupla separada por coma) como ves en el código más arriba encerrados los dos elementos por paréntesis uno tomara el lugar de clave y el siguiente el de valor.

 

Función zip() Fusionamos listas y las  convertimos en diccionarios

Para convertir una lista común a una lista de esta manera podemos utilizar la función zip() que admite como parámetro un conjunto de listas, veámoslo en un ejemplo fusionando dos listas para crear un diccionario:

Resultado:

{‘Juan’: 16, ‘Maria’: 14, ‘Pedro’: 18}

Como vemos se ha creado un diccionario con las listas anteriores, correspondiendo en el orden de clave y valor. Teniendo en cuenta que ambas listas tienen la misma cantidad de elementos, de lo contrario el elemento que quede fuera por impar no aparecerá en el diccionario.

Iterando diccionarios: claves o valores, y ambas con bucle for

Podemos iterar un diccionario para obtener solo las claves, los valores o ambos a la vez. Primeramente aclararte que puedes utilizar el método keys(), values() como hemos visto en métodos de los diccionarios que nos facilitaran la iteracion de un único elemento clave, o valor. O para ambos podemos utilizar el método items().

Iterando las claves de un diccionario

 

Resultado:

Rojo
Amarillo
Verde

Si almacenamos en una variable las claves mediante el método keys obtenemos una vista del diccionario que nos permite trabajar solo con las claves y nos presenta la ventaja de que al cambiar un elemento del diccionario automáticamente se actualizara..

Iterando los valores de un diccionario

 

 

Resultado:

Avanzar
Despacio
Detenerse

Si almacenamos en una variable los valores mediante el método values obtenemos una vista del diccionario que nos permite trabajar solo con los valores y nos presenta la ventaja de que al cambiar un elemento del diccionario automáticamente se actualizara..

Iterando ambos, claves y valores de un diccionario

 

 

Resultado:

Amarillo significa Despacio
Rojo significa Detenerse
Verde significa Avanzar

¡Que pasada! no debemos pasarnos en rojo! Aquí estamos iterando el diccionario completo utilizando items() en caso contrario, obtendremos un error si intentamos iterar directamente sobre el diccionario.

Adiooos!Esto ha sido todo, espero hayas aprendido a crear listas y diccionarios por comprensión así como a trabajar mejor con ambos! Nos vemos en la siguiente entrada! Bye bye

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.