Acá encontrarás ejercicios para practicar programar usando estructuras de datos.
En los siguientes videos podrás ver una explicación del tema y también la resolución paso a paso de estos ejercicios:
- Listas y tuplas
- Ejercicios de listas y tuplas
- Ejercicio integrador de listas y tuplas
- Conjuntos
- Ejercicios de conjuntos
- Diccionarios
- Ejercicios de diccionarios
- Ejercicio integrador de diccionarios
- Errores comunes con estructuras de datos
La resolución de cada ejercicio se muestra al hacer click sobre la consigna.
Nota: estos enunciados y resoluciones fueron diseñados con el objetivo de ayudar a programadores principiantes a desarrollar habilidades algorítmicas y de razonamiento lógico. La finalidad principal no se enfoca en la sintaxis y herramientas concretas de Python 3, y la mayoría de los ejercicios podrían resolverse con cualquier lenguaje dentro del paradigma imperativo. Es por ese motivo que algunas resoluciones muestran un algoritmo genérico y no orientado específicamente a Python.
1
A) Solicitar al usuario que ingrese números, los cuales se guardarán en una lista. Finalizar al ingresar el número 0, el cual no debe guardarse.
B) A continuación, solicitar al usuario que ingrese un número y, si el número está en la lista, eliminar su primera ocurrencia. Mostrar un mensaje si no es posible eliminar.
C) Recorrer la lista para imprimir la sumatoria de todos los elementos.
D) Solicitar al usuario otro número y crear una lista con los elementos de la lista original que sean menores que el número dado. Imprimir esta nueva lista, iterando por ella.
E) Generar e imprimir una nueva lista que contenga como elementos a tuplas de dos elementos, cada una compuesta por un número de la lista original y la cantidad de veces que aparece en ella. Por ejemplo, si la lista original es [5,16,2,5,57,5,2] la nueva lista contendrá: [(5,3), (16,1), (2,2), (57,1)]
Solución:
def sumatoria(lista):
suma=0
for n in lista:
suma+=n
return suma
def numerosMenores(lista, limite):
nueva=[]
for n in lista:
if n<limite:
nueva.append(n)
return nueva
def frecuencias(lista):
nueva=[]
for n in lista:
if [n, lista.count(n)] not in nueva:
nueva.append([n, lista.count(n)])
return nueva
#A
numeros=[]
nro=int(input("Número: "))
while nro!=0:
numeros.append(nro)
nro=int(input("Número: "))
#B
if eliminar in numeros:
numeros.remove(eliminar)
else:
print("Ese número no está entre los ingresados")
#C
print("Sumatoria de los números:", sumatoria(numeros))
eliminar=int(input("Número a eliminar: "))
#D
limite=int(input("Filtrar números menores a: "))
for n in numerosMenores(numeros, limite):
print(n)
#E
print("Frecuencias:")
for tupla in frecuencias(numeros):
print(tupla[0],"aparece",tupla[1],"veces.")
2
Escribir un programa que permita procesar datos de pasajeros de viaje en una lista de tuplas con la siguiente forma: (nombre, dni, destino). Ejemplo: [("Manuel Juarez", 19823451, "Liverpool"), ("Silvana Paredes", 22709128, "Buenos Aires"), ("Rosa Ortiz", 15123978, "Glasgow"), ("Luciana Hernandez", 38981374, "Lisboa")]
Además, en otra lista de tuplas se almacenan los datos de cada ciudad y el país al que pertenecen. Ejemplo: [("Buenos Aires","Argentina"), ("Glasgow","Escocia"), ("Lisboa", "Portugal"), ("Liverpool","Inglaterra"), ("Madrid","España")]
Hacer un menú iterativo que permita al usuario realizar las siguientes operaciones:
-Agregar pasajeros a la lista de viajeros.
-Agregar ciudades a la lista de ciudades.
-Dado el DNI de un pasajero, ver a qué ciudad viaja.
-Dada una ciudad, mostrar la cantidad de pasajeros que viajan a esa ciudad.
-Dado el DNI de un pasajero, ver a qué país viaja.
-Dado un país, mostrar cuántos pasajeros viajan a ese país.
-Salir del programa.
Solución:
def agregarPasajeros(pasajeros):
nombre=input("Nombre -x para cortar: ")
while nombre!="x":
dni=int(input("DNI: "))
destino=input("Ciudad destino: ")
pasajeros.append((nombre,dni,destino))
nombre=input("Nombre -x para cortar: ")
return pasajeros
def agregarCiudades(ciudades):
ciudad=input("Ciudad -x para cortar: ")
while ciudad!="x":
pais=input("País: ")
ciudades.append((ciudad,pais))
ciudad=input("Ciudad -x para cortar: ")
return ciudades
def buscarCiudad(pasajeros, dni):
for viaje in pasajeros:
if viaje[1]==dni:
return viaje[2]
return ""
def cantidadPasajerosCiudad(pasajeros, ciudad):
cantidad=0
for viaje in pasajeros:
if viaje[2]==ciudad:
cantidad+=1
return cantidad
def buscarPaisDestino(pasajeros, ciudades, dni):
buscada=buscarCiudad(pasajeros, dni)
for ciudad in ciudades:
if ciudad[0]==buscada:
return ciudad[1]
return ""
def cantidadPasajerosPais(pasajeros, ciudades, pais):
cantidad=0
for viaje in pasajeros:
if pais==buscarPaisDestino(pasajeros, ciudades, viaje[1]):
cantidad+=1
return cantidad
#programa principal
pasajeros=[]
ciudades=[]
while True:
print("1. Agregar pasajeros")
print("2. Agregar ciudades")
print("3. Buscar ciudad destino mediante el DNI")
print("4. Cantidad de pasajeros que viajan a una ciudad")
print("5. Buscar país destino mediante DNI")
print("6. Cantidad de pasajeros que viajan a un país")
print("7. Salir del programa")
opcion=int(input("Acción a ejecutar: "))
if opcion==1:
print("AGREGAR PASAJEROS")
pasajeros=agregarPasajeros(pasajeros)
elif opcion==2:
print("AGREGAR CIUDADES")
ciudades=agregarCiudades(ciudades)
elif opcion==3:
dni=int(input("DNI: "))
print("El pasajero viaja a", buscarCiudad(pasajeros, dni))
elif opcion==4:
ciudad=input("Ciudad a buscar: ")
print("Viajan", cantidadPasajerosCiudad(pasajeros, ciudad), "pasajeros")
elif opcion==5:
dni=int(input("DNI: "))
print("Viaja a", buscarPaisDestino(pasajeros, ciudades, dni))
elif opcion==6:
pais=input("País: ")
print("Viajan", cantidadPasajerosPais(pasajeros, ciudades, pais), "pasajeros")
elif opcion==7:
break
else:
print("Opción inválida")
3
Solicitar al usuario que ingrese los nombres de pila de los alumnos de nivel primario de una escuela, finalizando al ingresar “x”. A continuación, solicitar que ingrese los nombres de los alumnos de nivel secundario, finalizando al ingresar “x”.
- Informar los nombres de todos los alumnos de nivel primario y los de nivel secundario, sin repeticiones.<>
- Informar qué nombres se repiten entre los alumnos de nivel primario y secundario.
-Informar qué nombres de nivel primario no se repiten en los de nivel secundario.
Solución:
def cargarNombres(alumnos):
nombre=input("Nombre: ")
while nombre!="x":
alumnos.add(nombre)
nombre=input("Nombre: ")
return alumnos
primaria=set()
secundaria=set()
print("ALUMNOS DE PRIMARIA")
primaria=cargarNombres(primaria)
print("ALUMNOS DE SECUNDARIA")
secundaria=cargarNombres(secundaria)
print("NOMBRES DE TODOS LOS ALUMNOS:")
for nombre in primaria|secundaria:
print(nombre)
print("NOMBRES COMUNES:")
for nombre in primaria&secundaria:
print(nombre)
print("NOMBRES DE PRIMARIA QUE NO SE REPITEN EN SECUNDARIA:")
for nombre in primaria-secundaria:
print(nombre)
4
Suponer una lista con datos de las compras hechas por clientes de una empresa a lo largo de un mes, la cual contiene tuplas con información de cada venta: (cliente, día del mes, monto, domicilio del cliente). Ejemplo:
[("Nuria Costa", 5, 12780.78, "Calle Las Flores 355"), ("Jorge Russo", 7, 699, "Mirasol 218"), ("Nuria Costa", 7, 532.90, "Calle Las Flores 355"), ("Julián Rodriguez", 12, 5715.99, "La Mancha 761"), ("Jorge Russo", 15, 958, "Mirasol 218")]
Escribir una función que reciba como parámetro una lista con el formato mencionado anteriormente y retorne los domicilios de cada cliente al cual se le debe enviar una factura de compra. Notar que cada cliente puede haber hecho más de una compra en el mes, por lo que la función debe retornar una estructura que contenga cada domicilio una sola vez.
Solución:
def direcciones(ventas):
domicilios=set()
for venta in ventas:
domicilios.add(venta[3])
return domicilios
5
Escribir un programa que procese strings ingresados por el usuario. La lectura finaliza cuando se hayan procesado 50 strings. Al finalizar, informar la cantidad total de ocurrencias de cada carácter, en todos los strings ingresados. Ejemplo: "r":5, "%":3, "a":8, "9":1.
¿Cómo se podrían informar las ocurrencias de las letras del alfabeto únicamente, incluyendo el valor 0 para las letras que no aparecieron?
Solución:
contadores={}
for i in range(50):
cadena=input("Cadena de caracteres: ")
for caracter in cadena:
if caracter not in contadores:
contadores[caracter]=1
else:
contadores[caracter]+=1
print("Frecuencia de cada carácter")
for caracter, cantidad in contadores.items():
print(caracter, ": ", cantidad)
Para contabilizar sólo letras (mayúsculas y minúsculas por separado):
contadores={}
alfabeto="abcdefghijklmnñopqrstuvwxyz"
for letra in alfabeto+alfabeto.upper():
contadores[letra]=0
for i in range(50):
cadena=input("Cadena de caracteres: ")
for caracter in cadena:
if caracter.lower() in alfabeto:
contadores[caracter]+=1
print("Frecuencia de cada letra")
for caracter, cantidad in contadores.items():
print(caracter, ": ", cantidad)
6
Crear un programa para gestionar datos de los socios de un club, permitiendo:
-Cargar información de los socios en un diccionario para acceder por número de socio. Los datos a almacenar son: número, nombre y apellido, fecha de ingreso (ddmmaaaa), cuota al día (s/n). El programa debe iniciar con los datos de los socios fundadores ya cargados:
Socio nº1, Amanda Núñez, ingresó: 17/03/2009, cuota al día.
Socio nº2, Bárbara Molina, ingresó: 17/03/2009, cuota al día.
Socio nº3, Lautaro Campos, ingresó: 17/03/2009, cuota al día.
-Informar cantidad de socios del club.
-Solicitar al usuario el número de un socio y registrar que ha pagado todas las cuotas adeudadas.
-Modificar la fecha de ingreso de todos los socios ingresados el 13/03/2018, para indicar que en realidad ingresaron el 14/03/2018.
-Solicitar el nombre y apellido de un socio y darlo de baja (eliminarlo del listado).
-Imprimir el listado de socios completo.
Solución:
def cargarSocios(socios):
numero=int(input("Número de socio (0 para cortar): "))
while numero!=0:
nombre=input("Nombre y apellido: ")
fecha=input("Fecha de ingreso (DDMMAAAA): ")
cuota=input("¿Cuota al día? s/n: ")
socios[numero]=[nombre,fecha,cuota.lower()=="s"]
numero=int(input("Número de socio (0 para cortar): "))
return socios
def modificarFecha(socios, fecha_anterior, fecha_nueva):
for datos in socios.values():
if datos[1]==fecha_anterior:
datos[1]=fecha_nueva
return socios
def numeroSocio(socios, nombre):
for numero,datos in socios.items():
if datos[0].lower()==nombre.lower():
return numero
return 0
def formatoFecha(fecha):
return fecha[:2]+"/"+fecha[2:4]+"/"+fecha[4:]
def imprimirListado(socios):
for numero,datos in socios.items():
print("-Número:",numero)
print("-Nombre:",datos[0])
print("-Ingresó:", formatoFecha(datos[1]))
if datos[2]:
print("-Cuota al día")
else:
print("-En deuda")
socios_activos={1:["Amanda Núñez","17032009",True], 2:["Bárbara Molina","17032009",True], 3:["Lautaro Campos","17032009",True]}
print("***Cargar socios")
socios_activos=cargarSocios(socios_activos)
print("El club tiene", len(socios_activos), "socios")
print("***Registrar pago de cuotas")
numero=int(input("Número de socio: "))
socios_activos[numero][2]=True
print("***Modificando fecha de ingreso...")
socios_activos=modificarFecha(socios_activos, "13032018", "14032018")
print("***Eliminar socio")
nombre=input("Nombre y apellido: ")
numero=numeroSocio(socios_activos, nombre)
if numero in socios_activos:
del socios_activos[numero]
imprimirListado(socios_activos)