Ejercicios listas

# escribir una función recortarPalabras a la que le pasamos una lista de palabras
# y una longitud y nos devuelve una lista con las palabras de esa lonitud o superior
# recortarPalabras(["aa","bbb","cccc","dddddd"],4)->["cccc","dddddd"]
# con comprensión de listas es muy fácil

# escribir una función a la que le pasamos una lista de números y nos devuelve la mitad
# de los números pares, los impares los ignora
# mitadPares([1,2,5,8,10])->[1,4,5]


# escribir una función a la que le pasamos dos listas y nos devuelve true si tienen
# algún elemento en común y false en caso contrario
# elementoComun([1,2,3],[4,5,6])->false # elementoComun([1,2,3],[4,5,6,3])->true
# (es más fácil de lo que parece)

# escribir una función a la que le pasamos una lista de números y nos devuelve una tupla
# con la suma y la media de los números
# estadistica([1,2,3])->(6,2)

Desempaquetar

tupla = (1, 2, 3)
a, b, c = tupla  # desempaquetando la tupla. A las variables se les asignan automáticamente los
# valores de la tupla
print(a, b, c)


def extremos(*args):
    min = args[0]
    max = args[0]
    for n in args:
        if n < min:
            min = n
        if n > max:
            max = n
    return (min, max)


# tupla = extremos(1, 5, 3, 7, 9, 0, -2)
a, b = extremos(1, 5, 3, 7, 9, 0, -2)
print(a, b)

a, _, b = tupla # con el guión bajo ignoro elementos
print(a, b)

tupla=(1, 5, 3, 7, 9, 0, -2)

a,*b,c=tupla # con el asterisco capturo un numero indeterminado de elementos
print(a,b,c)

a,*_,c=tupla # con el asterisco y guion bajo ignoro un numero indeterminado de elementos
print(a,c)

Tuplas

# las tuplas son como las listas pero inmutables
# se definen con paréntesis
tupla = (1, 2, 3, 4, 5,6,7,8,9,10)

print(tupla[0])
print(len(tupla))
for t in tupla:
    print(t)

for i in range(len(tupla)):
    print (i,tupla[i])

# El mismo slicing que cadenas y listas

print(tupla[2:4])
print(tupla[2:])
print(tupla[:4])
print(tupla[2:-2])
print(tupla[-7:-2])
print(tupla[0::2])

# El operador in que lo teníamos en las cadenas también lo tenemos en tuplas y listas
if 8 in tupla:
    print("El 8 está en la tupla")

# sumar tuplas
otra=(1,2,3)
suma=tupla+otra

print(tupla,otra,suma)

lista=list(suma)
print(lista)

Ordenación de listas

# sumar listas para crear listas nuevas con los elementos de las listas sumados
lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
lista3 = lista1 + lista2
print(lista1, lista2, lista3)

# añadir a una lista existente otra lista
lista1.extend(lista2)
print(lista1, lista2, lista3)

lista4 = lista2 + lista1
print(lista4)
lista4.sort()
print(lista4)
lista4.sort(reverse=True)
print(lista4)

alumnos = ["Ana", "Eva", "pep", "Iu", "juan", "Rosa", "Iu", "Iu"]

alumnos.sort()
print(alumnos)

# usando key lo que le digo es que antes de ordenar aplique esa función
alumnos.sort(key=str.lower)
print(alumnos)

def valorAbsoluto(numero):
    if numero<0:
        numero=-numero
    return numero

valores=[1,-3,6,-2,-8,3,-4]
valores.sort(key=valorAbsoluto)

print(valores)

def nombreCompleto(tratamiento,nombre,apellido):
    return tratamiento+" "+nombre+" "+apellido

print(nombreCompleto("Sr.","Pepito","Pérez"))
print(nombreCompleto(nombre="Ana",tratamiento="Excelentísima",apellido="Pi"))

Comprensión de listas en Python: ejemplos

# eliminar elementos
nums = ["Ana", "Eva", "Pep", "Iu", "Juan", "Rosa", "Iu", "Iu"]

print(nums)

nums.pop(2)  # elimino el que está en la posición 2
print(nums)
nums.remove("Iu")  # Busca 'Iu' y lo elimina
print(nums)

print(nums)

for numero in nums:
    print(numero)

# for x in lista es el núcleo de la comprensión de listas
# la parte izquierda es la transformación del elemento
nueva = ["@" + elemento for elemento in nums]
print(nueva)

notas = [1, 2, 3, 4, 5, 7, 8, 9]
transformada = [nota * 2 for nota in notas]
print(transformada)
trans2 = [nota for nota in notas]
print(trans2)
trans3 = [7 for nota in notas]
print(trans3)

trans2 = [nota for nota in notas if nota % 2 == 0]
print(trans2)

nueva = [elemento for elemento in nums if len(elemento) > 3]
print(nueva)

precios = [10, 20, 15, 70, 32, 40]
pvp = [precio * 1.21 for precio in precios if precio >= 20]
print(pvp)

edad = 16

# Operador ternario
print("Mayor de edad" if edad >= 18 else "Menor de edad")

aprobar = [5 if nota < 5 else nota for nota in notas]
print(aprobar)


def cuadrado(num):
    return num ** 2

cuad = [cuadrado(num) for num in notas]
print(cuad)

Solución ejercicios listas y archivos

# crear una función generarRango a la que le pasamos un número y nos devuelve una lista
# desde el 1 hasta ese número generarRango(5)_>[1,2,3,4,5]

def generarRango(numero):
    rango = []
    for i in range(numero):
        rango.append(i + 1)
    return rango


print(generarRango(9))  # [1,2,3,4,5]


# crear una función mediaAritmetica a la que le pasamos una lista de números y nos devuelve la media
# mediaAritmetica([2,4,6])->4
def mediaAritmetica(lista):
    return sum(lista) / len(lista)


print(mediaAritmetica([2, 4, 6]))  # 4


# crear una función a la que le pasamos una letra y un número y nos genera una lista con esa letra
# repetida una, dos y hasta n veces
# generarCadenas("a",5)->["a","aa","aaa","aaaa","aaaaa"]

def generarCadenas(letra, numero):
    lista = []
    if len(letra) != 1:
        return lista
    for i in range(numero):
        lista.append(letra * (i + 1))
    return lista


print(generarCadenas("a", 5))  # ["a","aa","aaa","aaaa","aaaaa"]

# Crear una función a la que le pasamos un nombre de archivo y un número y nos crea ese archivo
# y nos escribe números de líneas hasta el número
# crearArchivo("datos.txt",5) nos genera un archivo 'datos.txt' con 5 líneas numeradas del 1 al 5

def crearArchivo(nombre,rango):
    archivo=open(nombre,"w")
    for i in range(rango):
        archivo.write(str(i+1)+"\n")
    archivo.close()

crearArchivo("datos.txt",5)

Bootstrap grid varios ejemplos

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- Latest compiled JavaScript -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>

<body>
    <div class="container">
        <div class="row">
            <div class="col-sm-3 bg-primary text-white">25%</div>
            <div class="col-sm-6 bg-dark text-white">
                <h1>hola</h1>
            </div>
            <div class="col-sm-3 bg-success  text-white">25%</div>
        </div>
        <div class="row">
            <div class="col-md bg-primary text-white"><img class="img-fluid " src="./img/foto.jpg" /></div>
            <div class="col-md bg-dark text-white"><img class="img-fluid " src="./img/foto.jpg" /></div>
            <div class="col-md bg-success  text-white"><img class="img-fluid " src="./img/foto.jpg" /></div>
        </div>
        <div class="row">
            <div class="col bg-primary text-white">25%</div>
            <div class="col bg-dark text-white">
                <h1>hola</h1>
            </div>
            <div class="col bg-success  text-white">25%</div>
            <div class="col bg-primary  text-white">25%</div>
            <div class="col bg-success  text-white">25%</div>
        </div>
        <div class="row">
            <div class="col-sm-6 col-md-3 bg-primary text-white">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
                dolore magna aliqua.<br>
                Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
                consequat.
            </div>
            <div class="col-sm-6 col-md-3 bg-dark text-white">
                Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam
                rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt
                explicabo.
            </div>
            <div class="col-sm-6 col-md-3 bg-success  text-white">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
                dolore magna aliqua.<br>
                Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
                consequat.
            </div>
            <div class="col-sm-6 col-md-3 bg-warning  text-white">
                Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam
                rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt
                explicabo.
            </div>
        </div>
        <div class="row">
            <div class="col">--</div>
        </div>
        <div class="row row-cols-1 row-cols-sm-2 row-cols-md-4">
            <div class="col bg-primary text-white">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
                dolore magna aliqua.<br>
                Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
                consequat.
            </div>
            <div class="col bg-dark text-white">
                Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam
                rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt
                explicabo.
            </div>
            <div class="col bg-success  text-white">
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
                dolore magna aliqua.<br>
                Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
                consequat.
            </div>
            <div class="col bg-warning  text-white">
                <div class="row">
                    <div class="col bg-primary text-white">25%</div>
                    <div class="col bg-dark text-white">
                        <h1>hola</h1>
                    </div>
                    <div class="col bg-success  text-white">25%</div>
                    <div class="col bg-primary  text-white">25%</div>
                    <div class="col bg-success  text-white">25%</div>
                </div>
            </div>
        </div>
    </div>
</body>

</html>

Solución alumnos definitiva

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Lista alumnos</title>
    <link rel="stylesheet" href="./css/bootstrap1.css">
</head>

<body>
    <div class="container ">
        <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalAlumno">
            Añadir alumno
        </button>
        <!--Utilizo la tabla para que quede más o menos bonito-->
        <table class="table table-striped m-4">
            <thead>
                <tr>
                    <th>Alumno</th>
                    <th>Nota</th>
                    <!-- Tengo el id para borrar todas las tareas-->
                    <th> <button type="button" class="btn btn-danger" id="borrar_alumnos">
                            Eliminar todos
                        </button></th>
                </tr>
            </thead>
            <tbody id="lista_alumnos">

            </tbody>
        </table>
        <!-- Utilizamos el Modal de w3school ¡copiado! -->
        <div class="modal fade" id="modalAlumno">
            <div class="modal-dialog  modal-xl modal-dialog-centered">
                <div class="modal-content">

                    <!-- Modal Header -->
                    <div class="modal-header">
                        <h4 class="modal-title">Nuevo alumno</h4>
                        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                    </div>

                    <!-- El input tiene un id porque necesito el valor -->
                    <div class="modal-body">
                        <input id="nombreAlumno" class="form-control " type="text"
                            placeholder="Introduzca el nombre del alumno">
                        <input id="notaAlumno" class="form-control " type="number"
                            placeholder="Introduzca la nota del alumno">
                    </div>

                    <!-- El boton de nueva tarea tiene un id por la misma razón -->
                    <div class="modal-footer">
                        <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Close</button>
                        <button type="button" class="btn btn-success" id="nuevo_alumno">Añadir alumno</button>
                    </div>

                </div>
            </div>
        </div>
    </div>
    <script src="./js/bootstrap.bundle.js"></script>
    <script src="./js/alumnos.js"></script>
</body>

</html>
let estado = {} // Para guardar todos los componentes que me hacen falta
window.onload = function () {
    // Guardo todos los accesos a los elementos html que necesito
    // Me olvido del html para el resto del código
    estado.nuevo = document.getElementById("nuevo_alumno");
    estado.nuevo.addEventListener("click", nuevoAlumno);
    estado.borrar = document.getElementById("borrar_alumnos");
    estado.borrar.addEventListener("click", borrarAlumnos);
    estado.tabla = document.getElementById("lista_alumnos");
    estado.nombre = document.getElementById("nombreAlumno");
    estado.nota = document.getElementById("notaAlumno");
    estado.modal = document.getElementById("modalAlumno");
    estado.alumnos = [];
    iniciar();
}
function iniciar() {
    // Rcupero los datos del storage esto se hace solo una vez
    getStorageData();
    pintarAlumnos();
}


function nuevoAlumno() {
    // Recuperar los datos del modal
    let alumno = getDatosAlumno();
    if (alumno.nota<0 || alumno.nota>10){
        alert("Nota incorrecta")
        return
    }
    // Añadirlos al estado
    estado.alumnos.push(alumno);
    // Pintar los datos
    pintarAlumnos()
    ocultarModal()
}
function borrarAlumnos() {
    estado.alumnos = [];
    pintarAlumnos();
}
function getDatosAlumno() {
    return { nombre: estado.nombre.value, nota: Number(estado.nota.value) }
}
function ocultarModal() {
    bootstrap.Modal.getInstance(estado.modal).hide();
}
function borrarAlumno() {
    let idalumno=this.dataset.idalumno
    estado.alumnos=estado.alumnos.filter((x,i)=>i!=idalumno);
    pintarAlumnos();
}
// Funciones de localStorage
function getStorageData(){
    let alumnos=localStorage.getItem("alumnos") || "[]";
    alumnos=JSON.parse(alumnos);
    estado.alumnos=alumnos
}
function setStorageData(){
    localStorage.setItem("alumnos",JSON.stringify(estado.alumnos))
}

// Una capa intermedia entre la función pura y nuestro programa
// Con el fin de que todo sea más escalable
function pintarAlumnos() {
    setStorageData();
    pintarDatos(estado.alumnos, estado.tabla)
}
function pintarDatos(alumnos, destino) {
    lista = "";
    let suma=0;
    let i=0;
    for (let alumno of alumnos) {
        lista += `<tr><td>${alumno.nombre}</td><td class=${alumno.nota >= 5 ? "text-success " : "text-danger"}>${alumno.nota}</td><td>
        <button data-idalumno="${i}" type="button" class="btn btn-danger btn-sm  borrar_alumno">
        Borrar
    </button>
        </td></tr>`;
        i++
        suma+=alumno.nota
    }
    let media=Math.round(suma*100/alumnos.length)/100
    lista += alumnos.length>0?`<tr><td>Media</td><td class=${media >= 5 ? "text-success " : "text-danger"}>${media}</td></tr>`:"";

    destino.innerHTML = lista;
    for (let boton of document.getElementsByClassName("borrar_alumno")) {
        boton.addEventListener("click",borrarAlumno);
    }
}

Solución ejercicio alumnos 1 versión

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Lista alumnos</title>
    <link rel="stylesheet" href="./css/bootstrap1.css">
</head>

<body>
    <div class="container ">
        <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalAlumno">
            Añadir alumno
        </button>
        <!--Utilizo la tabla para que quede más o menos bonito-->
        <table class="table table-striped m-4">
            <thead>
                <tr>
                    <th>Alumno</th>
                    <th>Nota</th>
                    <!-- Tengo el id para borrar todas las tareas-->
                    <th> <button type="button" class="btn btn-danger" id="borrar_alumnos">
                            Eliminar todos
                        </button></th>
                </tr>
            </thead>
            <tbody id="lista_alumnos">

            </tbody>
        </table>
        <!-- Utilizamos el Modal de w3school ¡copiado! -->
        <div class="modal fade" id="modalAlumno">
            <div class="modal-dialog  modal-xl modal-dialog-centered">
                <div class="modal-content">

                    <!-- Modal Header -->
                    <div class="modal-header">
                        <h4 class="modal-title">Nuevo alumno</h4>
                        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                    </div>

                    <!-- El input tiene un id porque necesito el valor -->
                    <div class="modal-body">
                        <input id="nombreAlumno" class="form-control " type="text"
                            placeholder="Introduzca el nombre del alumno">
                        <input id="notaAlumno" class="form-control " type="number"
                            placeholder="Introduzca la nota del alumno">
                    </div>

                    <!-- El boton de nueva tarea tiene un id por la misma razón -->
                    <div class="modal-footer">
                        <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Close</button>
                        <button type="button" class="btn btn-success" id="nuevo_alumno">Añadir alumno</button>
                    </div>

                </div>
            </div>
        </div>
    </div>
    <script src="./js/bootstrap.bundle.js"></script>
    <script src="./js/alumnos.js"></script>
</body>

</html>
let estado = {} // Para guardar todos los componentes que me hacen falta
window.onload = function () {
    // Guardo todos los accesos a los elementos html que necesito
    // Me olvido del html para el resto del código
    estado.nuevo = document.getElementById("nuevo_alumno");
    estado.nuevo.addEventListener("click", nuevoAlumno);
    estado.borrar = document.getElementById("borrar_alumnos");
    estado.borrar.addEventListener("click", borrarAlumnos);
    estado.tabla = document.getElementById("lista_alumnos");
    estado.nombre = document.getElementById("nombreAlumno");
    estado.nota = document.getElementById("notaAlumno");
    estado.modal = document.getElementById("modalAlumno");
    estado.alumnos = [];
    iniciar();
}
function iniciar() {
    estado.alumnos = [{ nombre: "Ana", nota: 5 }, { nombre: "Eva", nota: 8 }, { nombre: "Pep", nota: 3 }];
    pintarAlumnos()

}
function nuevoAlumno() {
    // Recuperar los datos
    let alumno = getDatosAlumno();
    // Añadirlos al estado
    estado.alumnos.push(alumno);
    // Pintar los datos
    pintarAlumnos()
    ocultarModal()
}
function borrarAlumnos() {
    estado.alumnos = [];
    pintarAlumnos();
}
function getDatosAlumno() {
    return { nombre: estado.nombre.value, nota: Number(estado.nota.value) }
}
function ocultarModal() {
    bootstrap.Modal.getInstance(estado.modal).hide();
}



// Una capa intermedia entre la función pura y nuestro programa
// Con el fin de que todo sea más escalable
function pintarAlumnos() {
    pintarDatos(estado.alumnos, estado.tabla)
}
function pintarDatos(alumnos, destino) {
    lista = "";
    let suma=0;
    for (let alumno of alumnos) {
        lista += `<tr><td>${alumno.nombre}</td><td class=${alumno.nota >= 5 ? "text-success " : "text-danger"}>${alumno.nota}</td></tr>`;
        suma+=alumno.nota
    }
    let media=Math.round(suma*100/alumnos.length)/100
    lista += `<tr><td>Media</td><td class=${media >= 5 ? "text-success " : "text-danger"}>${media}</td></tr>`;

    destino.innerHTML = lista;
}