Ejercicios listas

# 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]

#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

# 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"]

# 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

Listas, una introducción

numero = 5
cadena = "hola que tal"

numero += 9

cadena += " yo muy bien"

alumno1 = "Ana"
alumno2 = "Eva"
alumno3 = "Pep"

# Si tengo 20 alumnos no voy a tener 20 variables una para cada alumno
# Se han inventado las listas: una variable en la que yo puedo introducir muchos elementos

# como defino una lista: con corchetes [...]
# cada elemento está separado por comas
alumnos = ["Ana", "Eva", "Pep"]  # lista de nombres
notas = [5, 8, 6]  # lista de notas

print(alumnos)
print(notas)
# como accedo a los elementos de la lista: por su posición

print(alumnos[0])  # Ana
print(alumnos[1])  # Eva
print(alumnos[2])  # Pep

alumnos[2] = "Juan"  # en la posición 2 cambio Pep por Juan

print(alumnos)

# recorrer la lista
for alumno in alumnos:
    print(alumno)

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

listaMixta = [1, "Ana", True, 7.8]
listaMixtaAnidada = [1, "Ana", True, 7.8, [1, 2, 3]]

# valor y referencia

precio=15
otroprecio=precio # copia por valor
precio=20 # cuando cambio el valor de precio no cambia el de otroprecio
print(precio, otroprecio)

lista=[1,2,3,4]
otralista=lista # copia por referencia
otraMas=lista.copy() # copia por valor
lista[1]=27 # cuando cambio el valor de lista SI CAMBIA el de otralista
print(lista,otralista,otraMas)

def cambiarLista(lista):
    for i in range(len(lista)):
        lista[i]+=2

cambiarLista(lista)
print(lista,otralista)

# añadir elementos al final
lista.append(90)
print(lista)
# recupera y borra el elemento del final
elemento=lista.pop()
print(lista,elemento)

# recupera y borra un elemento en cualquier posición
elemento=lista.pop(0)
print(lista,elemento)

# insertar un elemento en cualquier posición
lista.insert(2,666)
print(lista)

cuadrados=[]
for i in range(11):
    cuadrados.append(i**2)
print(cuadrados)

print(cuadrados[-1])

# el mismo slicing que en cadenas

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

Ejemplos trabajo con archivos

# trabajar con archivos en python
# Tengo que abrir un archivo: open
# al abrirlo especifico el modo lectura (r) escritura (w) añadir(a)
# hago operaciones de escritura o de lectura
# cierro el archivo
import random
archivo=open("prueba.txt","w")
for i in range(5):
    archivo.write("Hola que tal\n")
archivo.close() # Es importante cerrar aunque si no cerramos no pasa nada

archivo=open("prueba.txt","r")
contenido=archivo.read()
print(contenido)
archivo.close()

archivo=open("tiradas.txt","w")
def tirada():
    if random.randint(1,2)==1:
        return "cara"
    else:
        return "cruz"
for i in range(10):
    archivo.write(tirada()+"\n")

archivo.close()

archivo=open("datos.csv","r")
datos=archivo.read()
for linea in datos.split("\n"):
    print("-->",linea)
    alumno=linea.split(";")
    print(alumno)

archivo.close()

# leer línea a línea

archivo = open("datos.csv", "r")
for linea in archivo:
    print("-->", linea.strip())
archivo.close()

archivo = open("datos.csv", "r")
linea = archivo.readline()
while (linea):
    print("-->", linea.strip())
    linea = archivo.readline()
archivo.close()

el archivo datos.csv:
Ana;ana@ana.com
pepe;pepe@pepe.com
Eva;eva@eva.com

Solución ejercicio bootstrap

<!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 rel="stylesheet" href="./css/bootstrap.css">
    <!-- Mis estilos van después del bootstrap -->
    <link rel="stylesheet" href="css/estilos.css">

</head>

<body>
    <!-- Utilizamos el card de w3school ¡copiado!-->
    <div class="d-flex ">
        <div class="card" style="width:400px">
            <div class="card-body">
                <h4 id="user_name" class="card-title">Jane Doe</h4>
                <p id="user_info" class="card-text">Some example text some example text. Jane Doe is an architect and
                    engineer</p>
                <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#myModal">
                    Añadir tarea
                </button>
                <button class="btn btn-info " data-bs-toggle="collapse" data-bs-target="#demo">Ver tareas <span
                        id="num_tareas" class="badge bg-danger">-</span></button>
            </div>
            <img id="user_image" class="card-img-bottom" src="../bootstrap4/img_avatar6.png" alt="Card image"
                style="width:100%">
        </div>

        <div id="demo" class="collapse">
            <!--Utilizo la tabla para que quede más o menos bonito-->
            <table class="table table-striped m-4">
                <thead>
                    <tr>
                        <th>Tareas pendientes</th>
                        <!-- Tengo el id para borrar todas las tareas-->
                        <th> <button type="button" class="btn btn-danger" id="borrar_tareas">
                                Eliminar todas
                            </button></th>
                    </tr>
                </thead>
                <tbody id="lista_tareas">

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

                <!-- Modal Header -->
                <div class="modal-header">
                    <h4 class="modal-title">Tarea nueva</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="tarea" class="form-control " type="text" placeholder="Introduzca la tarea">
                </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="nueva_tarea">Añadir tarea</button>
                </div>

            </div>
        </div>
    </div>
    <!-- Aquí los scripts -->
    <script src="./js/bootstrap.bundle.js"></script>
    <script src="./js/script.js"></script>
</body>

</html>
// Todas las acciones las hago cuando se ha cargado la página
window.onload = function () {
    // recojo todos  los elementos con los que voy a trabajar
    let modal = document.getElementById("myModal");
    let nueva_tarea = document.getElementById("nueva_tarea");
    let tarea = document.getElementById("tarea");
    let lista_tareas = document.getElementById("lista_tareas");
    let num_tareas = document.getElementById("num_tareas");
    let borrar_tareas = document.getElementById("borrar_tareas");
    // Cuando pulsen borrar_tareas elimino todas las tareas
    // Cómo? Obtener tareas->Modificar tareas->guardar tareas->pintar tareas
    borrar_tareas.addEventListener("click", () => {
        // borrar tareas
        localStorage.setItem("tareas", "[]");
        // pintar tareas
        pintaTareas();
    });
    // Cuando pulsen nueva_tarea añado la tarea a la lista
    nueva_tarea.addEventListener("click", () => {
        // obtener tareas
        let tareas = getTareas();
        // modificar taras
        tareas.push(tarea.value);
        // guardar tareas
        setTareas(tareas);
        // Oculto el modal
        bootstrap.Modal.getInstance(modal).hide();
        // pintar tareas
        pintaTareas();
    })
    // Obtengo los datos de la api
    fetch("https://randomuser.me/api")
        .then(response => response.json())
        .then(resultado => {
            // Aqui 'resultado' tiene ya el  json convertido a variable, la podemos usar
            console.log(resultado);
            // Llamo a una función con el usuario devuelto
            pintaUsuario(resultado.results[0]);
        });
    // pinto las tareas al iniciar la página para que si refresco me pinte lo que hay
    pintaTareas();
    function pintaTareas() {
        // Recupera las tareas
        let tareas = getTareas();
        // Modifica el número del badge
        num_tareas.innerHTML = tareas.length;
        // Si no tengo tareas no muestro el botón
        if (tareas.length==0){
            borrar_tareas.classList.add("d-none")
        }else{
            borrar_tareas.classList.remove("d-none")
        }
        // Crea los elementos de la tabla de tareas, lo hago con map
        // A cada botón le pongo el indice de la tarea que quiero borrar
        // Cómo? con el segundo parámetro del map
        // lo guardo en un atributo especial del html que es el data-
        // En el dataset tendré un atributo idtarea que valdrá el índice de la tarea que quiero borrar
        lista_tareas.innerHTML = tareas.map((x, i) => "<tr><td>" + x + `</td><td><button data-idtarea="${i}" type="button" class="btn btn-danger btn-sm  borrar_tarea">
        Borrar
    </button></td></tr>`).join("");
        // A cada botón le añado el evento de borrar
        for (let boton of document.getElementsByClassName("borrar_tarea")) {
            boton.addEventListener("click", function () {
                // Obtengo la tarea
                let tareas = getTareas();
                // Modifico las tareas: yo en dataset.idtarea tengo el id de la tarea que quiero eliminar
                tareas = tareas.filter((x, i) => i != this.dataset.idtarea);
                // Guardo las tareas
                setTareas(tareas);
                // Pinto las tareas
                pintaTareas();
            })
        }
    }
}
function getTareas() {
    // Recupero las tareas del storage y las parseo del JSON
    let tareas = localStorage["tareas"] || "[]";
    tareas = JSON.parse(tareas);
    return tareas;
}
function setTareas(tareas) {
    // Lo guardo en el localstorage
    localStorage["tareas"] = JSON.stringify(tareas);
}
function pintaUsuario(usuario) {
    // Ponemos los datos en el card
    let nombre = document.getElementById("user_name");
    let email = document.getElementById("user_info");
    let foto = document.getElementById("user_image");

    // nombre.innerHTML = Object.values(usuario.name).join(" ");
    nombre.innerHTML = usuario.name.title + " " + usuario.name.first + " " + usuario.name.last;
    email.innerHTML = usuario.email;
    foto.src = usuario.picture.large;
}

Ejercicios cadenas Python

# Vamos a crear una función cuantasPalabras a la que le pasamos una cadena y un caracte
# Y nos dice cuantas palabras en esa cadena contienen ese caracter
# cuantasPalabras("En un lugar de la mancha","e")->2
# cuantasPalabras("En un lugar de la mancha","n")->3
# cuantasPalabras("En un lugar de la mancha","j")->0
# Como veis da lo mismo mayúsculas que minúsculas

def cuantasPalabras(cadena, letra):
    """Nos cuenta cuantas palabras tienen esa letra"""
    cadena = cadena.lower()
    letra = letra.lower()
    cont = 0
    # recorrer las palabras
    for palabra in cadena.split():
        # saber si una palabra tiene esa letra
        if letra in palabra:
            cont += 1
    return cont


print(cuantasPalabras("En un lugar de la mancha", "e"))  # 2
print(cuantasPalabras("En un lugar de la mancha", "n"))  # 3
print(cuantasPalabras("En un lugar de la mancha", "j"))  # 0
print(cuantasPalabras("En un lugar de la mancha", "a"))  # 3


# Vamos a crear una función mezclar a la que le pasamos una cadena y nos crea otra con
# la primera parte las letras pares y la segunda las impares, con unos ejemplos lo vemos mejor:
# mezclar("abcdefg")->"acegbdf" mezclar("12345678")->"13572468"

def mezclarFor(cadena):
    """Nos crea una cadena con las letras pares primero y después las impares"""
    par = ""
    impar = ""
    for i in range(len(cadena)):
        if i % 2 == 0:
            par += cadena[i]
        else:
            impar += cadena[i]
    return par + impar


def mezclar(cadena):
    """Nos crea una cadena con las letras pares primero y después las impares"""
    return cadena[0::2] + cadena[1::2]


print(mezclar("abcdefg"))  # acegbdf
print(mezclar("12345678"))  # 13572468


# Vamos a crear una funcion que nos devuelva True si hay dos letras iguales repetidas
# repetidas("hola que tal")->False
# repetidas("viva sevilla")->True (hay dos l)
# repetidas("mi carro me lo robaron")->True (hay dos r)

def repetidas(cadena):
    for i in range(len(cadena) - 1):
        if cadena[i] == cadena[i + 1]:
            return True
    return False


print(repetidas("hola que tal"))  # ->False
print(repetidas("viva sevilla"))  # ->True (hay dos l)
print(repetidas("mi carro me lo robaron"))  # ->True (hay dos r)


def dobleLetra(frase):
    fraseLower = frase.lower()  # pongo el lower para que me pueda identificar todos los caracteres iguales
    indice = 1  # variable de soporte para comparar cada letra en el for vs. la siguiente letra de fraseLower (la cadena en la que busco dobles seguidos)
    for letra in fraseLower:
        if indice < len(frase) and letra == fraseLower[indice]:
            return True
        else:
            indice += 1
    return False


print(dobleLetra("Hola que tal"))  # debería devolver un false
print(dobleLetra("Mi carro me lo robaron"))  # debería devolver True

Ejemplo función: palíndromo

# saber si una cadena es un palíndromo
# Una cadena es un palíndromo si se lee igual de principio a fin que viceversa
# Isaac no ronca asi
# esPalindromo(cadena)- True si es palíndromo y false en caso contrario


def esPalindromo(cadena):
    """
    Comprueba si una cadena es un palíndromo, se lee igual de derecha a izquierda que al revés

    Args:
     cadena: cadena a comprobar
    Returns:
        bool: True si es palíndromo
    """
    # poner la cadena en mayúsculas o en minúsculas
    cadena = cadena.lower()
    # quitar espacios
    cadena = cadena.replace(" ", "")
    """if (cadena==cadena[::-1]):
        return True
    else:
        return False"""
    return cadena == cadena[::-1]


print(esPalindromo("Isaac no ronca asi"))  # true
print(esPalindromo("Hola que tal"))  # false
print(esPalindromo("Dabale arroz a la zorra el abad"))  # true

Ejemplos de cadenas en python

Subcadenas: https://www.learnbyexample.org/python-string-slicing/

cad1 = "hola"
cad2 = "adios"
print(cad1 + " y " + cad2)
print(cad1, " y ", cad2)

cad3 = "ana" * 3
print(cad3)

print(len(cad3))

# subcadenas usamos la sintaxis de los corchetes

cad4 = "En un lugar de  la mancha. Camión"
print(cad4[4])  # me escribe la posición 4
print(cad4[4:8])  # me escribe la posición 4 a la posición 8 no incluída
print(cad4[4:-4])  # desde la posición 4 hasta la posición 4 empezando desde el final
print(cad4[4:-1])  # desde la posición 4 hasta la posición 1 empezando desde el final
print(cad4[-4:-1])  # desde la posición 4 empezando desde el final hasta la posición 1 empezando desde el final
print(cad4[-1])  # último carácter
print(cad4[-2])  # penúltimo carácter

for i in range(len(cad4)):
    print(cad4[0:i + 1])

# conversiones de mayúsculas/minúsculas
print(cad4.upper())  # lo pone en  mayúsculas
print(cad4.lower())  # lo pone en minúsculas
print(cad4.capitalize())  # la primera letra de cada frase en mayúsculas, resto en minúsculas
print(cad4.title())  # la primera letra de cada pelabra en mayúsculas, resto en minúsculas
print(cad4.swapcase())  # las mayúsculas pasan a minúsculas y viceversa
print(cad4.casefold())  # También a minúsculas

# reemplazar
cad5 = cad4.replace("a", "@")  # reemplaza todas las apariciones de a en la cadena por @
cad6 = cad4.replace("a", "@", 2)  # lo mismo pero solo las dos primeras
print(cad5)
print(cad6)

# eliminar espacios
cad6 = "    hola que tal   "
print("|" + cad6.strip() + "|")  # elimina espacios al principio y al final de la cadena
print("|" + cad6.lstrip() + "|")  # elimina espacios al principio  de la cadena
print("|" + cad6.rstrip() + "|")  # elimina espacios  al final de la cadena

# buscar subcadenas dentro de una cadena

print("mancha" in cad4)  # esto me devuelve true porque mancha es una subcadena de cad4
print("pepe" in cad4)  # esto me devuelve false porque pepe NO es una subcadena de cad4

pos = cad4.find("en")  # busca la cadena 'en' dentro de la cad4 y nos devuelve la posición
pos3 = cad4.lower().find("en")  # busca la cadena 'en' dentro de la cad4 y nos devuelve la posición
pos2 = cad4.find("un")  # busca la cadena 'en' dentro de la cad4 y nos devuelve la posición
print(pos)  # -1 porque la cadena 'en' no está, está 'En' que no es lo mismo
print(pos2)  # porque 'un' está en la posición 3
print(pos3)  # porque 'en' está en la posición 0 (al principio) si lo paso a minúsculas

pos4 = cad4.find("a")
while pos4 != -1:
    print(pos4)
    pos4 = cad4.find("a", pos4 + 1)  # todas las apariciones de la letra 'a' dentro de cad4

cad6="en casa en ocasiones entiendo mis enredos"
pos=cad6.find("en")
print(pos)
pos=cad6.find("en",1)
print(pos)
pos=cad6.find("en",9)
print(pos)

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

# pasar de cadena a lista y viceversa
# split y join

lista=cad4.split() # me separa cada palabra y me la pone en una lista
print(lista)
print(len(lista)) # Número de palabras de la cadena
for palabra in lista:
    print(palabra) # Voy recorriendo cada palabra de la lista

print(cad6.count("en")) # todas las veces que aparece 'en' que puede ser dentro de una palabra
cont=0
for palabra in cad6.split():
    if palabra=="en":
        cont+=1
print(cont) # cuenta las veces que tenemos la palbra 'en'

cad7="1,2,3,4,5,6,7,8"
numeros=cad7.split(",")
print(numeros)
cad8="-".join(numeros)
print(cad8)

print(cad6[0:8:2]) # Voy de la posición 0 a la 8 de 2 en 2
print(cad6[8:0:-1]) # Voy de la posición 8 a la 0 de uno en uno pero al revés

print(cad6[:4]) # Va desde el principio hasta la posición 4
print(cad6[4:]) # Va desde  la posición 4 hasta el final
print(cad6[::-1]) # Invierte la cadena

invpalabras=""
for palabra in cad6.split():
    invpalabras+=palabra[::-1]+" "
print(invpalabras)

Ejemplo uso varias cosas de bootstrap con JS

 <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#myModal">
        Añadir tarea
    </button>
    <button class="btn btn-info " data-bs-toggle="collapse" data-bs-target="#demo">Ver tareas <span id="num_tareas"
            class="badge bg-danger">4</span></button>

    <div id="demo" class="collapse">
        <ul id="lista_tareas"></ul>
    </div>
    <!-- The Modal -->
    <div class="modal fade" id="myModal">
        <div class="modal-dialog  modal-xl modal-dialog-centered">
            <div class="modal-content">

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

                <!-- Modal body -->
                <div class="modal-body">
                    <input id="tarea" class="form-control " type="text" placeholder="Introduzca la tarea">
                </div>

                <!-- Modal footer -->
                <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="nueva_tarea">Añadir tarea</button>
                </div>

            </div>
        </div>
    </div>
    <script src="./js/bootstrap.bundle.js"></script>
    <script src="./js/script.js"></script>
let modal=document.getElementById("myModal");
let nueva_tarea=document.getElementById("nueva_tarea");
let tarea=document.getElementById("tarea");
let lista_tareas=document.getElementById("lista_tareas");
let num_tareas=document.getElementById("num_tareas");
nueva_tarea.addEventListener("click",()=>{
    let tareas=localStorage["tareas"] || "[]"
    tareas=JSON.parse(tareas);
    tareas.push(tarea.value);
    localStorage["tareas"]=JSON.stringify(tareas)
    bootstrap.Modal.getInstance(modal).hide()
    num_tareas.innerHTML=tareas.length
    lista_tareas.innerHTML=tareas.map(x=>"<li>"+x+"</li>").join("")
})

Ejemplo barra bootstrap

html

 <div class="progress">
        <div id="barra" class="progress-bar progress-bar-striped progress-bar-animated" style="width:10%"></div>
    </div>

jd

let barra = document.getElementById("barra")
let cont = 10
setTimeout(incrementarBarra, 1000)
function incrementarBarra() {
    cont+=5
    barra.style.width = cont + "%"
    barra.innerHTML = cont + "%"
    if (cont < 100) {
        setTimeout(incrementarBarra, 1000)
    }
}

Solución examen

function repetir(cadena, numero) {
    if (cadena.length != 1) { return ""; }
    return cadena.repeat(numero);
}

console.log(repetir("a", 6))
console.log(repetir("aasdasd", 6))

function masLarga(cad1, cad2) {
    return cad1.length > cad2.length ? cad1 : cad2
}

console.log(masLarga("hola", "adios"))
console.log(masLarga("hola amigos", "adios"))

function eliminarPares(lista) {
    return lista.filter(cad => cad.length % 2 != 0)
}

console.log(eliminarPares(["aa", "bbb", "ccccc", "dddd"]))

function repetidas(cadena){
    for(i=1;i<cadena.length;i++){
        if (cadena.at(i)==cadena.at(i-1) && cadena.at(i)!=" "){
            return true;
        }
    }
    return false;
}

function repetidasForeach(cadena){
    let res=false
    cadena.split('').forEach((valor,i)=>{
        if (valor==cadena.at(i+1)){
            res= true;
            return
        }
    })
    return res;
}


console.log(repetidasForeach('La luvia  en madrid'))