Más ejercicios listas

# funcion pivote de una lista de números nos divide la lista en 2 partes
# primero los menores del número que pasemos y por otra los mayores
# pivote([4,1,9,5,3,7],6)->([4,1,5,3],[9,7])

def pivote(lista, elemento):
    izq = []
    der = []
    for i in lista:
        if i < elemento:
            izq.append(i)
        elif i > elemento:
            der.append(i)
    return (izq, der)


print(pivote([4, 1, 9, 6, 5, 3, 7], 6))

izq,der=pivote([4, 1, 9, 6, 5, 3, 7], 6)
print(izq,der)

# funcion ordenarLista a la que le pasamos una lista de palabras y nos la ordena por la longitud de las cadenas
# ordenarLista(["bbb","a","ddddd","cccc"])->["a","bbb","cccc","ddddd"]

def ordenarLista(lista):
    lista2=lista.copy()
    lista2.sort(key=len)
    return lista2

# funcion aplicarFuncion a la que le pasamos una lista de numeros y una función y nos devuelve la lista aplicando la función a cada uno de los elementos

def doble(numero):
    return numero*2

def aplicarFuncion(lista,funcion):
    lista2 = [funcion(x) for x in lista]
    return lista2

print(aplicarFuncion([1,2,3,4],doble))

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"))

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)

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

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