# 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]
# Cual es el mayor y cual es el menor
# Esta solución es más fácil
def menorMayor(lista):
ordenada = sorted(lista)
return [ordenada[0], ordenada[-1]]
# Esta solución es más eficiente, porque ordenar es algo muy costoso
def menorMayor2(lista):
menor = lista[0]
mayor = lista[0]
for numero in lista:
if numero < menor:
menor = numero
if numero > mayor:
mayor = numero
return [menor, mayor]
# Esto de aquí hay que evitarlo: No se modifican los parámetros que pasamos
def menorMayor3(lista):
lista.sort()
menor = lista.pop(0)
mayor = lista.pop(-1)
return [menor, mayor]
print(menorMayor([3, 1, 8, 5]))
print(menorMayor2([3, 1, 8, 5]))
milista = [2, 1, 6, 8, 33, 4, 12, 25]
print(menorMayor3(milista))
print(milista)
# 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"]
# Tener un sitio donde guardar el resultado
# recorrer la lista
# como pasar una cadena a minúsculas
def minusculas(lista):
resultado = []
for elemento in lista:
resultado.append(elemento.lower())
return resultado
print(minusculas(["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"]
# Tener un sitio donde guardar el resultado
# recorrer la lista
# Si la longitud es par, lo añado a la lista
def longitudPar(lista):
resultado = []
for elemento in lista:
if len(elemento) % 2 == 0:
resultado.append(elemento)
return resultado
print(longitudPar(["aa", "bbb", "cccc", "ddddd"]))
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())