Ejercicios listas

# Definir el algoritmo
# Los pasos que vamos a implementar para resolver el problema
# La 'receta'
# Divide y vencerás: un problema grande se compone de otros más pequeños
# Lo primero es pensar ¿Cömo voy a resolver este problema?

 # Cread una función a la que le pasamos una lista de números y nos devuelva una lista
 # con el menor y el mayor
 # menorMayor([3,1,8,5])->[1,8]
 
 # Cread una función a la que le pasamos una lista de nombres y nos devuelve una lista
 # con todos los nombres en minúsculas
 # minusculas(["Ana","Pep","Iu"])->["ana","pep","iu"]
 
 
 # Cread una función a la que le pasamos una lista de cadenas y nos devuelve una lista
 # con las que tengan una longitud par
 # longitudPar(["aa","bbb","cccc","ddddd"])->["aa","cccc"]

Más ejemplos listas

# Crea una función a la que le pasamos una lista de cadenas y me devuelva la más larga
# si hay varias cadenas con la misma longitud, la primera
# masLarga(["aa","eeeee","bbb"])->"eeeee"

# en algún sitio guardaré la cadena más larga
# recorrer la lista
# si la cadena que estoy mirando es más larga que la que ya tengo me quedo con ella

def masLarga(lista):
    larga = ""
    for cadena in lista:
        # Aquí está la magia
        if len(cadena) > len(larga):
            larga = cadena

    return larga

lista = ['a', 'b', 'c', 'a']
print(lista.index('a'))  # 0
print(lista.index('a', 1))  # 3

numeros = [2, 4, 6, 8, 9, 6, 9, 7, 6]
try:
    pos = numeros.index(6)  # 2
    print(pos)
    pos = numeros.index(6, pos + 1)  # 5
    print(pos)
    pos = numeros.index(6, pos + 1)  # 8
    print(pos)
    pos = numeros.index(6, pos + 1)  # Error
    print(pos)
except:
    print("No encontrado")

print(numeros.count(6))

copia_incorrecta = numeros
copia_correcta = numeros.copy()
numeros[0] = 27
print(copia_incorrecta)
print(copia_correcta)
copia_incorrecta[1] = 99
print(numeros)
print(copia_correcta)

# Cuidado con modificar las listas dentro de las funciones, porque la modificación afecta fuera
# Si por lo que sea tenemos que modificar, hagamos una copia
def sumar(lista):
    suma = 0
    for i in range(len(lista)):
        suma += lista.pop()
    return suma




def buscar(lista,elemento):
    posiciones=[]
    try:
       pos=lista.index(elemento)
       while True:
           posiciones.append(pos)
           pos = lista.index(elemento,pos + 1)
    except:
        return posiciones

print(buscar(numeros,6))

numeros = [2, 4, 6, 8, 9, 6, 9, 7, 6]

numeros.sort()
# Modificamos la propia lista, que queda ordenada
print(numeros)

numeros.sort(reverse=True)

print(numeros)

numeros = [2, 4, 6, 8, 9, 6, 9, 7, 6]
# Nos crea una copia ordenada de la lista y la lista original queda como estaba
ordenados = sorted(numeros)

print(numeros)
print(ordenados)

numeros.reverse()
print(numeros)

clase = ["Ana", "Pep", "Rosa", "Iu", "Eva"]
clase.reverse()
print(clase)

clase = ["Ana", "Pep", "Rosa", "Iu", "Eva"]
# Tengo que convertir a lista por cosillas del Python, que no devuelve una lista sino un iterador
clase_vuelta = list(reversed(clase))
print(clase)
print(clase_vuelta)
# Aquí no hace falta convertir a lista porque el in funciona con iteradores
for alumno in reversed(clase):
    print(alumno)

# El key nos permite ordenar por funciones diferentes a las alfabéticas
# En este caso, ordeno por longitud
clase_orden = sorted(clase, key=len)
print(clase_orden)

Soluciones ejercicios

# Cread una función a la que le pasamos un cantidad y nos devuelve una lista con
# esa cantidad de la cadena "hola" repetidas
# crearHolas(4)->["Hola","Hola","Hola","Hola"]

def crearHolas(cantidad):
    # devolver una lista con la cadena "Hola" repetida 'cantidad' veces
    resultado = []
    # Tengo añadir la cadena "Hola" a esa lista n veces
    # 1.- Hacer algo n veces for
    # 2.- Añadir una cadena a una lista append
    for i in range(cantidad):
        resultado.append("Hola")

    return resultado


def crearHolas2(cantidad):
    return ["Hola"] * cantidad


print(crearHolas(4))
print(crearHolas2(4))


# tengo la siguiente función que me calcula la media de una lista
def media(lista):
    suma = 0
    for numero in lista:
        suma += numero
    return (suma / len(lista))


# Cread una función mediaAprobados que nos calcule la media pero solo de aquellos números
# que son >=5

def mediaAprobados(lista):
    suma = 0
    cont = 0
    for numero in lista:
        if numero >= 5:
            suma += numero
            cont += 1
    print(suma)
    return (suma / cont)


def mediaAprobados2(lista):
    aprobados = []
    for numero in lista:
        if numero >= 5:
            aprobados.append(numero)
    return media(aprobados)


lista = [1, 8, 3, 4, 5, 6, 2, 8, 9]
calculo = mediaAprobados(lista)
print(calculo)
calculo = mediaAprobados2(lista)
print(calculo)


# Cread una función a la que le pasemos una lista de cadenas y una longitud y nos diga
# cuantas cadenas son mayores de esa longitud
# contarCadenas(["aaa","bbbb","ccccc"],3)->2

def contarCadenas(lista, longitud):
    # una variable donde contar
    cont = 0
    # recorrer la lista de cadenas
    for cadena in lista:
        # Si la cadena tiene una longitud mayor de 'longitud' contarla y si no hago nada
        if len(cadena) > longitud:
            cont += 1
    return cont


print(contarCadenas(["aaa", "bbbb", "ccccc"], 3))
print(contarCadenas(["aaa", "bbbb", "ccccc"], 2))


# Cread una función a la que le pasamos una lista de cadenas y nos devuelve True si
# alguna de las cadenas tiene una 'j'
# tieneJ(["aa","bb"])->False   tieneJ(["aa","bb","ajo"])->True

def tieneJ(lista):
    # recorrer la lista
    for cadena in lista:
        # si la cadena tiene una j devuelvo true si no tiene NO HAGO NADA
        if "j" in cadena:
            return True
    # si al final ninguna ha tenido una j devolvemos false
    return False


print(tieneJ(["aa", "bb"]))
print(tieneJ(["aa", "bb", "ajo"]))


# Crea una función a la que le pasamos una lista de cadenas y me devuelva la más larga
# si hay varias cadenas con la misma longitud, la primera
# masLarga(["aa","eeeee","bbb"])->"eeeee"

# en algún sitio guardaré la cadena más larga
# recorrer la lista
# si la cadena que estoy mirando es más larga que la que ya tengo me quedo con ella

def masLarga(lista):
    larga = ""
    for cadena in lista:
        # Aquí está la magia
        if len(cadena) > len(larga):
            larga = cadena

    return larga

Ejercicios listas

# Cread una función a la que le pasamos un cantidad y nos devuelve una lista con
# esa cantidad de la cadena "hola" repetidas
# crearHolas(4)->["Hola","Hola","Hola","Hola"]


# tengo la siguiente función que me calcula la media de una lista
def media(lista):
    suma = 0
    for numero in lista:
        suma += numero
    return(suma / len(lista))

# Cread una función mediaAprobados que nos calcule la media pero solo de aquellos números
# que son >=5

# Cread una función a la que le pasemos una lista de cadenas y una longitud y nos diga
# cuantas cadenas son mayores de esa longitud
# contarCadenas(["aaa","bbbb","ccccc",3)->2



# Cread una función a la que le pasamos una lista de cadenas y nos devuelve True si
# alguna de las cadenas tiene una 'j'
# tieneJ(["aa","bb"])->False   tieneJ(["aa","bb","ajo"])->True

Ejemplos listas

notas = [10, 6, 3, 5, 8, 9, 2, 7]

# Calcula media
suma = 0
for nota in notas:
    suma += nota
print(suma / len(notas))

# Si mas o igual a 5 es aprobado cuantos aprobados tenemos
aprobados = 0
for nota in notas:
    if nota >= 5:
        aprobados += 1

print(aprobados)

# Crea una lista con las notas de los suspendidos
suspendidos = []
for nota in notas:
    if nota < 5:
        suspendidos.append(nota)

print(suspendidos)

Listas en python

# listas: colección de variables

nota = 7  # Una variable en la que guardo un valor
notas = [5, 8, 6, 4]  # Una lista es una colección de variables

vacia = []
foo = ["hola"]
varios = ["a", "b", "c"]

mixta = [1, 4, "cadena", False, 3.56, "otra cadena", 28]  # Los elementos pueden ser de cualquier tipo

print(mixta[2])  # cadena
print(mixta[-1])  # 28 (el último)

for elemento in mixta:
    print(elemento)

print(mixta[2:4])
print(mixta[2:5])
print(mixta[2:3])

clase = ["Ana", "Pep", "Eva", "Iu"]

# la variable alumno va a ir tomando los valores de la lista 'clase'
# es decir, primero Ana, después Pep, luego Eva y por último Iu
for alumno in clase:
    print(alumno)

# Mutables: que se pueden cambiar

clase[1] = "Juan"
print(clase)

# Métodos de las listas

# append añade un elemento al final de la lista
clase.append("Rosa")
print(clase)

# extend nos añade una lista al final de otra lista
otraclase = ["John", "Mary"]
clase.extend(otraclase)

print(clase)

# también podemos hacerlo simplemente sumando
otraclasemas = ["Luis", "María"]
clase += otraclasemas
print(clase)

# el append también se puede hacer sumando pero ¡ojo! entre corchetes
clase += ["Fernando"]
print(clase)

# Podemos insertar un elemento en cualquier posición con insert

clase.insert(2, "Florencia")

# ¡Ojo! No es lo mismo insertar que cambiar. Añado Florencia y el resto se desplaza
print(clase)

# Eliminamos la primera ocurrencia de Florencia
clase.remove("Florencia")
print(clase)

# Extraer elementos

# Estoy extrayendo el último elemento y lo estoy guardando en último
ultimo = clase.pop()
print(ultimo)
print(clase)

# Puedo hacer pop sin guardar, simplemente elimino el último elemento
clase.pop()
print(clase)

# pop puede tener como parámetro una posición

al = clase.pop(3)  # extraigo el elemento 3 (Iu)
print(al)
print(clase)

for i in range(len(clase)):
    clase.pop()

print(clase)

Soluciones ejercicios

# Cread una función a la que le pasamos dos cadenas y nos devuelve la cadena más larga
# si son iguales nos devuelve la primera
# masLarga("hola","adios")-> "adios"

def masLarga(cadena1, cadena2):
    if len(cadena1) >= len(cadena2):
        return cadena1
    else:
        return cadena2


print(masLarga("hola", "adios"))


# Cread una función que nos devuelva True si la cadena empieza y acaba por la misma letra, False en caso contrario
# mismoInicioFin("hola")->False mismoInicioFin("ajada")->True

def mismoInicioFin(cadena):
    return cadena[0] == cadena[-1]  # if cadena[0]==cadena[-1] return True else: return False


def mismoInicioFinOtro(cadena):
    if cadena[0] == cadena[-1]:
        return "Empiezan y acaban por la misma letra"
    else:
        return "Tiene inicio y fin distinto"


print(mismoInicioFin("hola"))
print(mismoInicioFin("ajada"))
print(mismoInicioFinOtro("ajada"))


# Cread una función a la que le pasemos una cadena y nos reemplace todas las 'l' por un '1'
# y todas las 'e' por '3' independientemente de si son mayúsculas o minúsculas
# numerizar("leche")->"13ch3"

def numerizar(cadena):
    cadena = cadena.lower()
    cadena = cadena.replace("l", "1")
    cadena = cadena.replace("e", "3")
    return cadena


def numerizarCompacto(cadena):
    cadena = cadena.lower().replace("l", "1").replace("e", "3")
    return cadena


print(numerizarCompacto("leche"))


# Cread una función a la que le pasemos una cadena y nos devuelva la cadena invertida
# alreves("hola")->"aloh"

def alreves(cadena):
    resultado = ""
    for letra in cadena:
        resultado = letra + resultado
    return resultado


def alrevesNinja(cadena):
    return cadena[::-1]


cadena = "en un lugar de la mancha"

print(cadena[2:5])
print(cadena[:10])
print(cadena[:])

print(cadena[2:5:2])  # el primer número es el inicio. El segundo el final. El tercero el paso
print(cadena[:10:2])  # Si no pongo el primero se entiende que desde el principio
print(cadena[::3])  # Si no pongo tampoco el segundo se entiende que hasta el final

print(cadena[::-1])

print(alreves("hola"))
print(alrevesNinja("hola"))


# Cread una función que nos diga si en una cadena hay letras repetidas consecutivas
# repetidas("hola que tal")-> False  repetidas("sevilla")->True

def repetidas(cadena):
    anterior = ""
    for letra in cadena:
        # si la letra es igual a la anterior devuelvo True[
        if letra == anterior:
            return True
        # Guardo en anterior la letra actual, que será la anterior del siguient paso del bucle
        anterior = letra
    # He recorrido toda la cadena y no he encontrado una letra repetida, devuelvo False
    return False


def repetidasDos(cadena):
    # Ir desde el 1 hasta el final de la cadena
    # Porque antes del 0 no hay letra
    for i in range(1, len(cadena)):
        if cadena[i] == cadena[i - 1]:
            return True
    return False


print(repetidasDos("sevilla"))
print(repetidasDos("hola que tal"))

Ejercicios cadenas

# Cread una función a la que le pasamos dos cadenas y nos devuelve la cadena más larga
# si son iguales nos devuelve la primera
# masLarga("hola","adios")-> "adios"



# Cread una función que nos devuelva True si la cadena empieza y acaba por la misma letra, False en caso contrario
# mismoInicioFin("hola")->False mismoInicioFin("ajada")->True


# Cread una función a la que le pasemos una cadena y nos reemplace todas las 'l' por un '1'
# y todas las 'e' por '3' independientemente de si son mayúsculas o minúsculas
# nnumerizar("leche")->"13ch3"


# Cread una función a la que le pasemos una cadena y nos devuelva la cadena invertida
# alreves("hola")->"aloh"


# Cread una función que nos diga si en una cadena hay letras repetidas consecutivas
# repetidas("hola que tal")-> False  repetidas("sevilla")->True

Ejemplos funciones de cadena

# podemos definir nuestras propias funciones
# pero python tiene muchas funciones predefinidas

cadena = "Hola que tal"

print(len(cadena))

# Funciones de cadena: nos permiten manipular cadenas de texto

# Acceder a un carácter específico de la cadena o a un rango de caracteres

print(cadena[3])  # imprime la letra 'a'

# Con los dos puntos obtenemos una subcadena de la cadena desde el primer carácter hasta el último NO INCLUÍDO
print(cadena[3:7])  # imprime 'a qu' va del 3 al 6 (incluído)

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

mayusculas = cadena.upper()
print(mayusculas)
minusculas = cadena.lower()
print(minusculas)
print(cadena.title())

# Si una cadena está dentro de otra
print("que" in cadena)
print("pepe" in cadena)

# Nos busca la posición de una cadena dentro de otra
# Si no está nos devuelve -1
posicion = cadena.find("que")
print(posicion)
posicion = cadena.find("pepe")
print(posicion)

# Podemos reemplazar una cadena por otra

print(cadena.replace("que", "ke"))
print(cadena.replace("a", "@"))

print(cadena.replace("a", ""))
# Podemos indicar las veces que queremos reemplazar
cadena = "patatas para ana"
print(cadena.replace("a", "@", 3))

cadena = "   hola que tal   "
# con strip quito espacios del principio y del final

print(cadena.strip().upper())  # encadenamiento y funciona porque las funciones devuelven un valor

sinespacios = cadena.strip()
mayus = sinespacios.upper()
print(mayus)

# en una cadena reemplazar las A por @ independentemiente de mayúsculas o minúsculas

cad = "CADA PATATA tiene carbohidratos"

print(cad.lower().replace("a", "@"))

some_string = 'Hello World'
print('Testing a String')
print('-' * 20)
print('some_string', some_string)
print("some_string.startswith('H')",
some_string.startswith('H'))
print("some_string.startswith('h')",
some_string.startswith('h'))
print("some_string.endswith('d')", some_string.endswith('d'))
print('some_string.istitle()', some_string.istitle())
print('some_string.isupper()', some_string.isupper())
print('some_string.islower()', some_string.islower())
print('some_string.isalpha()', some_string.isalpha())
print('String conversions')
print('-' * 20)
print('some_string.upper()', some_string.upper())
print('some_string.lower()', some_string.lower())
print('some_string.title()', some_string.title())
print('some_string.swapcase()', some_string.swapcase())
print('String leading, trailing spaces', " xyz ".strip())

Parámetros por defecto y llamar a otra función

# Podemos tener parámetros por defecto o con valores predeterminados

def saludo(nombre="Anónimo"):
    return "Hola " + nombre


ana = saludo("Ana")

anonim = saludo()  # Como no paso un valor a 'nombre' pone por defecto 'Anónimo'

print(ana, anonim)


def potencia(numero, exponente=2):
    return numero ** exponente  # En python para elevar un número a otro se usa ** numero^exponente


# suma 1+1+1+1+1  5*1 (multiplicación)
# multiplicación 5*5*5*5 5^4 (potencia)


print(potencia(2, 4))
print(potencia(8))  # Como no le pongo valor a 'exponente' le pone por defecto 2


# En la siguiente función vamos a hacer que la cantidad por defecto sea '2'
# Si yo pongo repetir("Ana")-> "AnaAna"

def repetir2(cadena, cantidad):
    return cadena * cantidad


# Que las funciones pueden llamar a otras funciones

def esPar(numero):
    # En general siempre que tenemos un if que devuelve true o false podemos devolver directamente la condición del if
    return numero % 2 == 0


def sumaPares(numero):
    suma = 0
    for i in range(0, numero + 1):
        if esPar(i):
            suma += i
    return suma


print(sumaPares(100))


def esVocal(letra):
    if letra == "a" or letra == "e" or letra == "i" or letra == "o" or letra == "u":
        return True
    else:
        return False


def contarVocales(cadena):
    # variable que acumula: en este caso lo que hago es contar
    contador = 0
    # Bucle para recorrer, en este caso recorro todas letras de la cadena
    for letra in cadena:
        # En letra tenemos todas las letras de la cadena
        # Llamamos a la función esVocal para saber si es vocal o no

        if esVocal(letra):
            # Si sí que es vocal, contamos uno
            contador += 1
    # devolvemos el resultado
    return contador


print(esVocal("a"))
print(esVocal("j"))

print(contarVocales("hola que tal"))  # 5


def esPrimo(numero):
    for i in range(2, numero):
        if numero % i == 0:
            return False
    return True


def mostrarPrimos(numero):
    resultado="1"
    for i in range(2,numero+1):
        if esPrimo(i):
            resultado+=f",{i}"
    return resultado

print(esPrimo(100))
print(esPrimo(17))

print(mostrarPrimos(50))