<jupyter_start><jupyter_text>[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/MauricioRR-Tec/Sistemas-Inteligentes/blob/master/Notebooks/practica_1_python.ipynb)  Ejercicios bases de Python  Estructuras, asignación y funciones  1. Creando una agenda Utiliza los conceptos básicos de python para crear una agenda telefónica. Deberás completar las funciones crear_agenda, agregar_contacto, eliminimar_contacto y buscar_contacto que se encuentran en las siguientes celdas.* ```crear_agenda()```, esta función devuelve una nueva agenda vacía, elige el tipo de dato que creas adecuado para este proposito.* ```agregar_contacto(agenda, nombre, numero)```, esta función debe permitir agregar un nuevo contacto a la agenda, además si un contacto ya existe con el nombre recibido entonces debes almacenar su nuevo numero sin eliminar el anterior.* ```buscar_contacto(agenda, nombre)```, esta función debe de regresar el o los números registados de un contacto, si el contacto no existe entonces imprimer el mensaje "Contacto no encontrado en la agenda".* ```eliminar_contacto(agenda, nombre)```, esta función permite eliminar a un contacto de la agenda, si el contacto no existe entonces imprimer el mensaje "Contacto no encontrado en la agenda".<jupyter_code>def crear_agenda():
    agenda = {}
    return agenda
def agregar_contacto(agenda, nombre, numero):
    if nombre in agenda:
        if not numero in agenda[nombre]:
            agenda[nombre].append(numero)
            return agenda
        else:
            return agenda
    else: 
        agenda[nombre] = [numero]
        return agenda
agenda = crear_agenda()
agenda = agregar_contacto(agenda, "Javier", "1234567890")
agenda = agregar_contacto(agenda, "Mario", "1234567890")
def buscar_contacto(agenda, nombre):
    if nombre in agenda:
        print(f"Números de {nombre}: {agenda[nombre]}")
    else:
        print("Contacto no encontrado en la agenda")
buscar_contacto(agenda, "Javier")
agenda = agregar_contacto(agenda, "Javier", "0987654321")
agenda = agregar_contacto(agenda, "Javier", "0987654321")
buscar_contacto(agenda, "Javier")
def eliminar_contacto(agenda, nombre):
    if nombre in agenda:
        del agenda[nombre]
        print(f"Contacto: {nombre} ha sido eliminado")
        return agenda
    else:
        print("Contacto no encontrado en la agenda")
        return agenda
agenda = crear_agenda()
agenda = agregar_contacto(agenda, "Javier", "0987654321")
agenda = eliminar_contacto(agenda, "Javier")<jupyter_output>Contacto Javier ha sido eliminado<jupyter_text>Ejercicios estadística  Función suma$$    suma(a) = \sum_{i=1}^{n}a_i$$<jupyter_code>def suma(x):
    total = 0
    for num in x:
         total += num
    return total
assert suma([1, 2, 3, 4, 5]) == 15<jupyter_output><empty_output><jupyter_text>Función promedio.$$	\bar{x} = \dfrac{\sum_{i=1}^{n}x_i}{n}$$<jupyter_code>def promedio(x):
    promedio = suma(x)/len(x)
    return promedio
assert promedio([1, 2, 3, 4, 5]) == 3, "Error en promedio"<jupyter_output><empty_output><jupyter_text>Función varianza.$$\sigma^2 = \frac{1}{n} \sum_{i=1}^{n}(x_i - \bar{x})^2$$<jupyter_code>def var(x):
    var = 0
    for n in x:
        var += (n - promedio(x))**2
    return var / len(x)
assert var([1, 2, 3, 4, 5]) == 2, "Error en var"<jupyter_output><empty_output><jupyter_text>Ejercicios álgebra lineal  Vectores con listas  Ones Completa la función ones1D que recibe como parámetros un entero $n$ y retorna una lista de tamaño $n$ con todos sus elementos con el valor $1$.Ejemplo:```>>> ones(5)[1, 1, 1, 1, 1]```<jupyter_code>def ones_1d(n):
    ones_list = [1]
    return ones_list * n<jupyter_output><empty_output><jupyter_text>Ejecuta la siguiente celda para comprobar la función ones1D:<jupyter_code>assert len(ones_1d(10)) == 10 and  ones_1d(3).count(1) == 3 and sum(ones_1d(5)) == 5  , "error en la funcion ones_1d"
print("La funcion es correcta")<jupyter_output>La funcion es correcta<jupyter_text>Ones 2D Completa la función ones_2d que recibe como parámetros un entero $n$ y un entero $m$ y retorna una lista con $n$ sub-listas cada una de tamaño $m$ con todos sus elementos con el valor 1. En otras palabras, una matriz $n \times m$ con sus elementos iniciados con valor $1$.Ejemplo:```>>> ones_2d(2, 3)[[1, 1, 1], [1, 1, 1]]```<jupyter_code>def ones_2d(m, n):
    ones_ll = [ones_1d(n)]
    return ones_ll * m<jupyter_output><empty_output><jupyter_text>Ejecuta la siguiente celda para comprobar la función ones2D:<jupyter_code>assert len(ones_2d(2, 3)) == 2 and len(ones_2d(2, 3)[0]) == 3 and sum([x_i for sl in ones_2d(3, 2) for x_i in sl]) == 6 , "error en la funcion ones_2d"
print("La funcion es correcta")<jupyter_output>La funcion es correcta<jupyter_text>Producto punto (inner) Completa la función ones_2d que recibe como parametros dos listas a, b de la misma longitúd y retorna el producto punto de ambos.El producto punto está definido como:$$a = [a_1 a_2 ... a_n] \: y \: b = [b_1 b_2 ... b_n]$$$$a \cdot b = a_1*b_1 + a_2*b_2 + \dots + a_n*b_n$$<jupyter_code>def inner(a, b):
    total = 0
    for (i, j) in zip(a, b):
        total += i * j 
    return total
assert inner([1, 2, 3], [1, 2 ,3]) == 14, "Error en inner"
print("Correcto")<jupyter_output>Correcto<jupyter_text>Matrices con listas de listas  Matriz identidad$$	I_{ij} = \begin{cases}		1 & i=j\\		0 & i \neq j\\	\end{cases}$$<jupyter_code>def eye(n):
    I = [[0 for _ in range(n)] for _ in range(n)] #zeros
    for i in range(n):
        I[i][i] = 1
    return I
assert eye(2) == [[1, 0], [0, 1]], "Error en eye"<jupyter_output><empty_output><jupyter_text>Matriz transpuesta$$C = A^T \Leftrightarrow c_{ij} = a{ji}$$Por ejemplo, si:	$$	A = \begin{bmatrix}	a_{11} & a_{12}  \\	a_{21} & a_{22}  \\	a_{31} & a_{32}  \\	\end{bmatrix}	$$	entonces	$$	A^T = \begin{bmatrix}	a_{11} & a_{21} & a_{31} \\	a_{12} & a_{22} & a_{32} \\	\end{bmatrix}	$$<jupyter_code>def transpose(A):
    A_t = [[A[j][i] for j in range(len(A))] for i in range(len(A[0]))]
    return A_t
assert transpose([[1, 2], [3, 4], [5, 6]]) == [[1, 3, 5], [2, 4, 6]], "Error en transpose"<jupyter_output><empty_output><jupyter_text>Valida multiplicación```True``` si$$A \qquad es \qquad mxn$$y$$B \qquad es \qquad nxp$$```False``` en otro caso<jupyter_code>def validate_mat_mul(A, B):
    colsA = len(A[0])
    rowsB = len(B)
    val = colsA == rowsB
    return val
assert validate_mat_mul([[1, 2], [3, 4]], [[5, 6], [7, 8]]) and \
validate_mat_mul([[1, 2], [3, 4], [5, 6]], [[1, 2, 3], [4, 5, 6]]) and \
not validate_mat_mul([[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2], [3, 4]]), "Error en validate_mat_mul"<jupyter_output><empty_output><jupyter_text>Multiplicación de matricesSi $A \in \mathbb{R}^{m \times n}$ y $B \in \mathbb{R}^{n \times p}$ entonces:$$C = A B \in \mathbb{R}^{m \times p}\Leftrightarrow c_{ij} = \sum_{k=1}^{n}a_{ik} b_{kj}$$<jupyter_code>def mat_mul(A, B):
    C = [[inner(A[i], B[j]) for j in range(len(B[0]))] for i in range(len(A))]
    return C
    
assert mat_mul([[1, 2], [3, 4], [5, 6]], [[2, 2], [2, 2]]) == [[6, 6], [14, 14], [22, 22]], "Error en mat_mul"<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15398576015635906, 'fraction_numerical': 0.0354600027921262, 'mean_word_length': 4.506533435818601, 'pattern_counts': {'":': 0, '<': 49, '<?xml version=': 0, '>': 55, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '475216', 'license': 'MIT', 'n_tokens_mistral': 2970, 'n_tokens_neox': 2819, 'n_words': 792, 'path': 'Modulo_1/practica_1_python.ipynb', 'repo_name': 'JulianHerreraH/Sistemas_Inteligentes', 'size': '7163'}