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:
#Por extensión: a = [0, 2, 4, 6 ,8] print (a) #Por comprensión a = [x for x in range(9) if x % 2 == 0] ## <Expression> for <Element> in <Iterable> if <condition> print (a)
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!
ListaCuadrados = [x**2 for x in range(10)] # <Expression> for <Element> in <Iterable> print (ListaCuadrados)
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.
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 root <root@debian> # vocales = ['A', 'E', 'I', 'O', 'U'] Nombres = ['Tamara', 'Marcelo', 'Martin', 'Juan', 'Alberto', 'Exequiel', 'Alejandro', 'Leonel', 'Antonio', 'Omar', 'Antonia', 'Amalia', 'Daniela', 'Sofia', 'Celeste', 'Ramon', 'Jorgelina', 'Anabela'] Nombresvocales = [nombre for nombre in Nombres if nombre[0] in vocales] print (Nombresvocales)
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 índice “0” 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:
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 root <root@debian> # Nombresvocales = [] vocales = ['A', 'E', 'I', 'O', 'U'] Nombres = ['Tamara', 'Marcelo', 'Martin', 'Juan', 'Alberto', 'Exequiel', 'Alejandro', 'Leonel', 'Antonio', 'Omar', 'Antonia', 'Amalia', 'Daniela', 'Sofia', 'Celeste', 'Ramon', 'Jorgelina', 'Anabela'] for nombre in Nombres: #Para el elemento nombre, iteramos la lista Nombres if nombre[0] in vocales: #Si el índice 0 del elemento nombre está en la lista vocales Nombresvocales.append (nombre)#Agregamos el nombre a la lista Nombresvocales print (Nombresvocales)
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.
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # Listafemeninos = [] #Creamos la lista vacía Listamasculinos = [] #Creamos la lista vacía Nombres = ['Tamara', 'Marcelo', 'Martin', 'Juan', 'Alberto', 'Exequiel', 'Alejandro', 'Leonel', 'Antonio', 'Omar', 'Antonia', 'Amalia', 'Daniela', 'Sofia', 'Celeste', 'Ramon', 'Jorgelina', 'Anabela'] for nombre in Nombres: #Para el elemento nombre, iteramos la lista Nombres if nombre[-1] == 'a' or nombre[-1] == 'e': #Si el índice -1 del elemento nombre en Nombres es a o e Listafemeninos.append (nombre)#Agregamos el nombre a la lista Listafemeninos else: Listamasculinos.append (nombre)#Si no termina en a o e agregamos a Listamasculinos print (Listafemeninos) print ("-------------------") print (Listamasculinos)
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.
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # Nombres = ['Tamara', 'Marcelo', 'Martin', 'Juan', 'Alberto', 'Exequiel', 'Alejandro', 'Leonel', 'Antonio', 'Omar', 'Antonia', 'Amalia', 'Daniela', 'Sofia', 'Celeste', 'Ramon', 'Jorgelina', 'Anabela'] Listafemeninos = [nombre for nombre in Nombres if nombre[-1] == 'a' or nombre[-1] == 'e'] #Creamos la lista Listamasculinos = [nombre for nombre in Nombres if nombre[-1] != 'a' and nombre[-1] != 'e'] #Creamos la lista print (Listafemeninos) print ("-------------------") print (Listamasculinos)
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 la 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
if all (condición / bucle for): #Si todos devuelven True, devuelve True. Caso contrario, False if any (condición / bucle for): #Devuelve True si alguno es True. Devuelve False si esta vació o todos son #False
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 cabrón!!
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # Numeros= [] while True: Numerito1 = (int(input("Ingresa un numero mayor de 5 y menor de 10 \n"))) #Pedimos numero Numeros.append(Numerito1) #Agregamos numero a la lista Numerito2 = (int(input("Ingresa un numero mayor de 5 y menor de 10 \n")))#Pedimos numero Numeros.append(Numerito2)#Agregamos numero a la lista Numerito3 = (int(input("Ingresa un numero mayor de 5 y menor de 10 \n")))#Pedimos numero Numeros.append(Numerito3)#Agregamos numero a la lista print (Numeros)#Imprimimos la lista de numeros if all (numero >= 5 and numero <= 10 for numero in Numeros): #Comprueba si todos los números cumple la condición mayor o igual a 5 y #Menor o igual a 10 print ("Correcto! Los números ingresados son mayores a 5 y menores a 10") print ("Gracias y hasta luego") break #Rompemos el bucle elif any (numero >= 5 and numero <= 10 for numero in Numeros): #Comprueba si algún numero es mayor a 5 o mayor a 10 print ("Algún numero no es correcto") Numeros= [] #Reseteamos la lista print ("Vuelve a intentarlo") else: print ("Error no has ingresado ningún numero mayor a 5 o menor a 10") print ("Suerte la próxima perdedor, ni siquiera un solo numero!") break #Rompemos el bucle
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()
Ahora 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:
#Creando un diccionario usando dict dict((x, x * x) for x in (1, 2, 3, 4)) #Para imprimirlo print (dict((x, x * x) for x in (1, 2, 3, 4))) #Almacenarlo y imprimirlo ss = (dict((x, x * x) for x in (1, 2, 3, 4))) print (ss) #Sintaxis dict(<clave>, <valor> for <elemento> in <iterable>)
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:
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # Lista = [('hola', 'python')] #Lista diccionario = {k:v for k, v in Lista} #Creando diccionario a partir de lista print (diccionario)
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:
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # L1 = ['Maria', 'Juan', 'Pedro'] #Lista con los nombres LEdades = [14, 16, 18]# Lista con las edades diccionario = (dict(zip(L1, LEdades))) #Creamos un diccionario fusionando con zip() print (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
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # semaforo = {'Rojo' : 'Detenerse', 'Amarillo' : 'Despacio', 'Verde' : 'Avanzar'} colores = semaforo.keys() #Creamos la variable colores que almacena las keys() for color in colores: print (color)
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
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # semaforo = {'Rojo' : 'Detenerse', 'Amarillo' : 'Despacio', 'Verde' : 'Avanzar'} acciones = semaforo.values() #Creamos la variable acciones que almacena los values() for accion in acciones: # Iteramos print (accion)
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
#!/usr/bin/env python # -*- coding: utf-8 -*- # # sin título.py # # Copyright 2018 https://pythones.net # semaforo = {'Rojo' : 'Detenerse', 'Amarillo' : 'Despacio', 'Verde' : 'Avanzar'} elementos = semaforo.items() #Creamos la variable elementos que almacena key y values for k,v in elementos: # Iteramos print ((k), ('significa'), (v)) #Imprimimos k (key) y v(value)
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.
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
Entrada anterior! | Siguiente entrada! |
Puff si que estuvo intenso esta lección, pero emocionado por que ya casi acabo el módulo. Seguimos…
Y muchas gracias por todo el contenido… Espero pronto poder donarte algo.
Extraordinario curso te has mandado! De estar super perdido a poder armarme algunos humildes códigos…gracias a tu gran trabajo!
Nuevamente gracias. Excelente curso. Sinceramente lo felicito
Hola, estan geniales estos cursos, la verdad que me los estoy devorando por lo menos uno por dia.
Queria aprender python y no encontraba ningun curso rapido y facil, hasta que di con el tuyo.
Fuera de eso, estoy haciendo la primer parte de esta seccion y en el codigo que hiciste de almacenar las 3 variables entre 5 y 10 me quede pensando, porque pediste 3 numeros y los almacenaste en 3 variables, ya que podias agregar un while, un contador y usar la misma variable, te dejo aqui el codigo:
numeros=[]
cont=0
while True:
while cont=5 and numero=5 and numero <=10 for numero in numeros):
print ("Algo mal")
numeros=[]
cont=0
print ("Otra Vez")
else:
print ("los numeros no son mayores que 5 o menor que 10, ninguno")
break
Nada, el aporte inutil del dia jajaja.
Saludos desde Uruguay
Hola Compas estaba levantando este código pero no logro dar con una solución para cumplir con este enunciado.
“Debera en primera instancia solicitar el rut del paciente, luego verificar que el paciente se encuentre registrado en el sistema. Una vez validado se le solicitara ingresar la fecha de atencion y las observaciones de la visita, y lo almacenara en la variable registros, concatenando los registros antiguos y los nuevos.
validar = True
diccionario_pacientes = {}
#FUNCIONES
def consultar_datos():
global diccionario_pacientes
buscar = int(input(“Ingresar el rut del Paciente: “))
if buscar in diccionario_pacientes:
print(
“””
Rut: {}
Nombre: {}
Direccion: {}
Correo: {}
Edad: {}
Sexo: {}
Registro: {}
Prevision: {}
“””.format(buscar,diccionario_pacientes[buscar][0],diccionario_pacientes[buscar][1],diccionario_pacientes[buscar][2],diccionario_pacientes[buscar][3],diccionario_pacientes[buscar][4],diccionario_pacientes[buscar][5],diccionario_pacientes[buscar][6]))
else:
print(“\n EL PACIENTE NO EXISTE\n”)
def atencion_paciente():
global diccionario_pacientes
rut = int(input(‘Ingrese rut del paciente: ‘))
if rut in diccionario_pacientes:
“””
ESTE CICLO ES EL QUE NO LOGRO TERMINAR
“””
else:
print(“\n EL PACIENTE NO EXISTE\n”)
def agregar_paciente():
global diccionario_pacientes
global validar
print(‘Has ingresado a la opcion de registrar un Paciente: ‘)
preguntar = input(‘\nDesea ingresar un nuevo Paciente (S/N): \r\n’)
while preguntar == ‘s’ or preguntar == ‘S’:
while validar:
try:
rut = int(input(‘Ingresar rut: ‘))
if 5000000 <= rut 1 and correo.index(‘@’) and correo.index(‘.’):
validar = False
else:
print(‘\nEl Correo debe contener mas de un caracter\n’)
except ValueError:
print(‘\nDebe ingresar @ y .\n’)
validar = True
while validar:
try:
edad = int(input(‘Ingresar edad: ‘))
if 0 <= edad <= 110:
validar = False
else:
print('\nIngresar edad entre 0 y 110\n')
except:
print('\nIngresar solo numeros\n')
validar = True
while validar:
sexo = input('Ingresar sexo (F/M): ')
if len(sexo) == 1 and (sexo == 'f' or sexo == 'F' or sexo == 'M' or sexo == 'm'):
validar = False
else:
print('Debe ingresar solo un caracter que sea /F/M)')
validar = True
registrar = input('Ingresar Registros: ')
while validar:
ps = input('Ingresar prevension (ISAPRE/FONASA): ').upper()
if (ps == 'ISAPRE' or ps == 'isapre' or ps == 'FONASA' or ps == 'fonasa'):
validar = False
else:
print('\nDebe ingresar solo (FONASA/ISAPRE)\n')
validar = True
diccionario_pacientes[rut] = nombre, direccion, correo, edad, sexo, registrar, ps,
print(f"\n Paciente {nombre} fue ingresado al sistema\n")
preguntar = input('\nDesea ingresar un nuevo pacientes (S/N): \r\n')
#MENUPRINCIPAL
diccionario_pacientes={}
menuprincipal = int(input("\nCentro Médico DUOC \nMenu principal:\n \n1. Registrar Paciente \n2. Atencion Paciente \n3. Consultar Datos Paciente \n4. Salir \n \nIngresar Opcion: "))
while menuprincipal != 4:
if menuprincipal == 1:
print("\n Registrar Paciente\n")
agregar_paciente()
elif menuprincipal == 2:
print("\n Atencion Pacientes\n")
atencion_paciente()
elif menuprincipal == 3:
print("\n Consultar Datos Paciente\n")
consultar_datos()
else:
print("Opcion incorrecta, favor digital opcion correcta")
menuprincipal = int(input("\nCentro Médico DUOC \nMenu principal:\n \n1. Registrar Paciente \n2. Atencion Paciente \n3. Consultar Datos Paciente \n4. Salir \n \nIngresar Opcion: "))
print("Gracias por su preferencia")
Hola Sebastian puedes enviarme el código por el privado del chat de Discord o por email para poder ayudarte bien. Saludos