{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DCChuelga"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hola soy Felipe! Estudio Ingeniería en Computación y uso el lenguaje Python en Windows\n",
      "Hola soy Johny! Estudio Ingeniería en Computación y uso el lenguaje Ruby en Windows\n",
      "Hola soy Matías! Estudio Ingeniería en Computación y uso el lenguaje C en Mac\n",
      "Hola soy Hernán! Estudio Ingeniería en Computación y uso el lenguaje C++ en Linux\n",
      "Hola soy Jorge! Estudio Ingeniería en Computación y uso el lenguaje JavaScript en Windows\n",
      "Hola soy Cata! Estudio Ingeniería Eléctrica y mi profe favorito es Cádiz\n",
      "Hola soy Nathaly! Estudio Ingeniería Eléctrica y mi profe favorito es Watts\n",
      "Hola soy Jorge! Estudio Ingeniería Eléctrica y mi profe favorito es Tejos\n",
      "Hola soy Matiu! Estudio Ingeniería Eléctrica y mi profe favorito es Mery\n",
      "Hola soy Martín! Estudio Ingeniería Eléctrica y mi profe favorito es Garcés\n",
      "Hola soy Carlos! Estudio Ingeniería Matemática y mi fórmula favorita es e ** (i * pi) + 1 = 0\n",
      "Hola soy Clemente! Estudio Ingeniería Matemática y mi fórmula favorita es int_a_b(f(x) dx) = F(a) - F(b)\n",
      "Hola soy Carlita! Estudio Ingeniería Matemática y mi fórmula favorita es a ** 2 + b ** 2 = c ** 2\n",
      "Hola soy Angel! Estudio Ingeniería Matemática y mi fórmula favorita es d(x,y) = 0 <=> x = y\n",
      "Hola soy Gonzalo! Estudio Ingeniería Matemática y mi fórmula favorita es n + (n-1) + ... + 1 = (n * (n - 1)) / 2\n",
      "Hola soy Pato! Estudio Ingeniería Robótica y mi nombre robot es p@trixxi_o223\n",
      "Hola soy Juanín! Estudio Ingeniería Robótica y mi nombre robot es xXxXXJUANINXXxXxx\n",
      "Hola soy Antoni! Estudio Ingeniería Robótica y mi nombre robot es Aaaant_ni\n",
      "Hola soy Robert! Estudio Ingeniería Robótica y mi nombre robot es TheRobertGamer\n",
      "Hola soy Totoi! Estudio Ingeniería Robótica y mi nombre robot es DonToToy123\n"
     ]
    }
   ],
   "source": [
    "from abc import ABC, abstractmethod\n",
    "from os import path\n",
    "\n",
    "\n",
    "def leer(nombre_archivo):\n",
    "    with open(nombre_archivo) as archivo:\n",
    "        argumentos = archivo.readline().strip().split(\";\")\n",
    "        n_argumentos = len(argumentos)\n",
    "        linea = archivo.readline().strip()\n",
    "        while linea:\n",
    "            yield {argumentos[i]: linea.split(\";\")[i] for i in range(n_argumentos)}\n",
    "            linea = archivo.readline().strip()\n",
    "\n",
    "\n",
    "class PrograAvanzada:\n",
    "\n",
    "    def __init__(self, semestre):\n",
    "        self.semestre = semestre\n",
    "        self.ayudantes = []\n",
    "        self.clases_ayudantes = {\"electrica\": AyudanteElectrica, \"robotica\": AyudanteRobotica,\n",
    "                                 \"ingemat\": AyudanteIngemat, \"dcc\": AyudanteDcc}\n",
    "\n",
    "    def añadir_ayudantes(self, nombre_archivo):\n",
    "        clase = self.clases_ayudantes[path.split(nombre_archivo)[-1][:-4]]\n",
    "        for kwargs in leer(nombre_archivo):\n",
    "            self.ayudantes.append(clase(**kwargs))\n",
    "\n",
    "    def saludo_ayudantes(self):\n",
    "        for ayudante in self.ayudantes:\n",
    "            ayudante.saludar()\n",
    "\n",
    "\n",
    "class Ayudante(ABC):\n",
    "\n",
    "    def __init__(self, nombre, creditos):\n",
    "        self.nombre = nombre\n",
    "        self.creditos = int(creditos)\n",
    "\n",
    "    @abstractmethod\n",
    "    def saludar(self):\n",
    "        pass\n",
    "\n",
    "\n",
    "class AyudanteElectrica(Ayudante):\n",
    "\n",
    "    def __init__(self, ramos_electrica, profe_favorito, **kwargs):\n",
    "        super().__init__(**kwargs)\n",
    "        self.ramos_electrica = ramos_electrica.split(\"|\")\n",
    "        self.profe_favorito = profe_favorito\n",
    "\n",
    "    def saludar(self):\n",
    "        print(f\"Hola soy {self.nombre}! Estudio Ingeniería Eléctrica y mi profe\",\n",
    "              f\"favorito es {self.profe_favorito}\")\n",
    "\n",
    "\n",
    "class AyudanteRobotica(Ayudante):\n",
    "\n",
    "    def __init__(self, ramos_robotica, nombre_robot, **kwargs):\n",
    "        super().__init__(**kwargs)\n",
    "        self.ramos_robotica = ramos_robotica.split(\"|\")\n",
    "        self.nombre_robot = nombre_robot\n",
    "\n",
    "    def saludar(self):\n",
    "        print(f\"Hola soy {self.nombre}! Estudio Ingeniería Robótica y\",\n",
    "              f\"mi nombre robot es {self.nombre_robot}\")\n",
    "\n",
    "\n",
    "class AyudanteIngemat(Ayudante):\n",
    "\n",
    "    def __init__(self, ramos_ingemat, formula_favorita, **kwargs):\n",
    "        super().__init__(**kwargs)\n",
    "        self.ramos_ingemat = ramos_ingemat.split(\"|\")\n",
    "        self.formula_favorita = formula_favorita\n",
    "\n",
    "    def saludar(self):\n",
    "        print(f\"Hola soy {self.nombre}! Estudio Ingeniería Matemática y\",\n",
    "              f\"mi fórmula favorita es {self.formula_favorita}\")\n",
    "\n",
    "\n",
    "class AyudanteDcc(Ayudante):\n",
    "\n",
    "    def __init__(self, ramos_dcc, lenguaje, os, **kwargs):\n",
    "        super().__init__(**kwargs)\n",
    "        self.ramos_dcc = ramos_dcc.split(\"|\")\n",
    "        self.lenguaje = lenguaje\n",
    "        self.os = os\n",
    "\n",
    "    def saludar(self):\n",
    "        print(f\"Hola soy {self.nombre}! Estudio Ingeniería en Computación y\",\n",
    "              f\"uso el lenguaje {self.lenguaje} en {self.os}\")\n",
    "\n",
    "\n",
    "avanzada = PrograAvanzada(\"2023-1\")\n",
    "avanzada.añadir_ayudantes(path.join(\"ayudantes\", \"dcc.csv\"))\n",
    "avanzada.añadir_ayudantes(path.join(\"ayudantes\", \"electrica.csv\"))\n",
    "avanzada.añadir_ayudantes(path.join(\"ayudantes\", \"ingemat.csv\"))\n",
    "avanzada.añadir_ayudantes(path.join(\"ayudantes\", \"robotica.csv\"))\n",
    "avanzada.saludo_ayudantes()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DCCumple"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Electronic\n",
      "28.52\n"
     ]
    }
   ],
   "source": [
    "from collections import namedtuple, defaultdict\n",
    "from functools import reduce\n",
    "\n",
    "\n",
    "persona = namedtuple(\"persona\", (\"nombre\", \"edad\", \"grupo\", \"dieta\", \"musica\"))\n",
    "\n",
    "\n",
    "def leer_lista_invitados(nombre_archivo):\n",
    "    with open(nombre_archivo,\"r\") as f:\n",
    "        return [persona(*line.strip().split(\",\"))for line in f.readlines()[1:]]\n",
    "\n",
    "\n",
    "invitados = leer_lista_invitados(\"invitados.csv\")\n",
    "\n",
    "# invitados validos\n",
    "invitados_validos = list(filter(lambda x: 18 <= int(\n",
    "    x.edad) <= 30 and x.grupo != \"B2\", invitados))\n",
    "\n",
    "print(invitados_validos)\n",
    "\n",
    "#orden por dieta\n",
    "\n",
    "por_dieta = defaultdict(list)\n",
    "[por_dieta[p.dieta].append(p) for p in invitados_validos]\n",
    "print(por_dieta)\n",
    "#------------------\n",
    "\n",
    "# orden por grupo\n",
    "\n",
    "nombre_y_grupo = map(lambda x: (x.nombre,x.grupo), invitados_validos)\n",
    "por_grupo = defaultdict(list)\n",
    "[por_grupo[grupo].append(nombre) for nombre, grupo in nombre_y_grupo]\n",
    "print(por_grupo)\n",
    "\n",
    "#otra forma \n",
    "[por_grupo[p.grupo].append(p.nombre) for p in invitados_validos]\n",
    "#------------------\n",
    "\n",
    "# musica fav\n",
    "musica = list(map(lambda x: x.musica ,invitados_validos))\n",
    "n_musica = {k: musica.count(k) for k in set(musica)}\n",
    "print(max(n_musica,key = lambda x: n_musica[x]))\n",
    "#------------------\n",
    "\n",
    "#Edad promedio\n",
    "\n",
    "#opción 1 \n",
    "edades = map(lambda x: int(x.edad), invitados_validos)\n",
    "suma_edades = reduce(lambda x,y: x + y,edades)\n",
    "#opción 2\n",
    "\n",
    "suma_edades = reduce(lambda x,y: x + int(y.edad),invitados_validos,0)\n",
    "\n",
    "# al añadir condición inicial, los elementos del iterable entran siempre como segundo argumento,\n",
    "#  por lo que podemos calcular el largo ignorando este\n",
    "total = reduce(lambda x,_ : x+1 ,invitados_validos,0)  \n",
    "\n",
    "print(suma_edades/total)\n",
    "#------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# I(IC2233)Tunes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import namedtuple\n",
    "import random\n",
    "\n",
    "# COMPLETAR: Define una Canción con la estructura adecuada\n",
    "Cancion = namedtuple(\"Cancion_type\", [\"nombre\", \"artista\"])\n",
    "\n",
    "\n",
    "class Playlist:\n",
    "\n",
    "    def __init__(self, canciones):\n",
    "        self.canciones = canciones\n",
    "        self.cola = None\n",
    "\n",
    "    def __iter__(self):\n",
    "        return self\n",
    "\n",
    "    def __next__(self):\n",
    "        if not self.cola:\n",
    "            raise StopIteration\n",
    "        else:\n",
    "            return self.cola.pop(0)\n",
    "\n",
    "    def mostrar_canciones(self):\n",
    "        for cancion in self.canciones:\n",
    "            print(f\"- {cancion.nombre} - {cancion.artista}\")\n",
    "\n",
    "    def existen_canciones(self):\n",
    "        return len(self.canciones)\n",
    "\n",
    "    def siguiente_cancion(self):\n",
    "        return next(self)\n",
    "\n",
    "    def reproducir_por_nombre(self, cancion):\n",
    "        self.cola = self.canciones.copy()\n",
    "        while self.cola[0] != cancion:\n",
    "            self.cola.pop(0)\n",
    "\n",
    "    def reproducir_al_azar(self):\n",
    "        self.cola = random.sample(self.canciones, len(self.canciones))\n",
    "\n",
    "    def agregar_cancion(self, cancion):\n",
    "        self.canciones = list(set(self.canciones).add(cancion))\n",
    "\n",
    "    def eliminar_cancion(self, cancion):\n",
    "        self.canciones = list(set(self.canciones).discard(cancion))\n",
    "\n",
    "\n",
    "class IIC2233Tunes:\n",
    "\n",
    "    def __init__(self):\n",
    "        self.cancion_actual = None\n",
    "        self.playlist_actual = None\n",
    "        self.playlists = {}\n",
    "\n",
    "    def fusionar_playlists(self, p1, p2):\n",
    "        print(\"\\n\")\n",
    "        print(\"-\" * 40)\n",
    "        nombre_playlist = input(\"Introduce el nombre de la playlist: \")\n",
    "\n",
    "        canciones = set(p1.canciones) | set(p2.canciones)\n",
    "        nueva_playlist = Playlist(list(canciones))\n",
    "        self.playlists[nombre_playlist] = nueva_playlist\n",
    "\n",
    "    def ejecutar(self):\n",
    "        self.menu_principal()\n",
    "\n",
    "    def menu_principal(self):\n",
    "\n",
    "        menu_principal = {\n",
    "            1: self.siguiente_cancion,\n",
    "            2: self.menu_ver_playlists,\n",
    "        }\n",
    "        while True:\n",
    "            print(\"\\n\")\n",
    "            if self.cancion_actual is not None:\n",
    "                print(f\"Estas escuchando: {self.cancion_actual.nombre}\" +\n",
    "                      f\" - {self.cancion_actual.artista}\")\n",
    "            else:\n",
    "                print(\"Estas escuchando: -\")\n",
    "            print(\"\\n\")\n",
    "            print(\"¿Qué quieres hacer?\")\n",
    "            print(\"-\" * 40)\n",
    "            print(\"1. Siguiente canción\")\n",
    "            print(\"2. Mis playlists\")\n",
    "            print(\"3. Salir\")\n",
    "            print(\"-\" * 40 + \"\\n\")\n",
    "            opc = int(input(\"Elige una opción por su número: \"))\n",
    "            if opc == 3:\n",
    "                break\n",
    "            else:\n",
    "                menu_principal[opc]()\n",
    "\n",
    "    def siguiente_cancion(self):\n",
    "        if self.playlist_actual is not None:\n",
    "            try:\n",
    "                self.cancion_actual = self.playlist_actual.siguiente_cancion()\n",
    "            except StopIteration:\n",
    "                self.playlist_actual = None\n",
    "                self.cancion_actual = None\n",
    "        else:\n",
    "            print(\"-\" * 40)\n",
    "            print(\"No hay canciones a la cola\")\n",
    "            print(\"-\" * 40 + \"\\n\")\n",
    "\n",
    "    def elegir_playlists(self):\n",
    "        nombres_playlists = list(self.playlists.keys())\n",
    "        print(\"\\n\")\n",
    "        for pl in nombres_playlists:\n",
    "            print(f\" - {pl}\")\n",
    "        print(\"-\" * 40 + \"\\n\")\n",
    "        opc = input(\"Elige una playlist por su nombre: \")\n",
    "        return opc\n",
    "\n",
    "    def menu_ver_playlists(self):\n",
    "\n",
    "        opciones_ver_playlist = {\n",
    "            1: self.menu_reproducir_playlist,\n",
    "            2: self.menu_agregar_playlist,\n",
    "            3: self.menu_editar_playlist,\n",
    "            4: self.menu_fusionar_playlists\n",
    "        }\n",
    "\n",
    "        print(\"\\n\")\n",
    "        print(\"¿Qué quieres hacer?\")\n",
    "        print(\"-\" * 40)\n",
    "        print(\"1. Reproducir playlist\")\n",
    "        print(\"2. Agregar playlist\")\n",
    "        print(\"3. Editar playlist\")\n",
    "        print(\"4. Fusionar playlists\")\n",
    "        print(\"-\" * 40 + \"\\n\")\n",
    "\n",
    "        opc = int(input(\"Elige una opción por su número: \"))\n",
    "        return opciones_ver_playlist[opc]()\n",
    "\n",
    "    def reproducir_por_nombre(self, playlist):\n",
    "        cancion = input(\"Introduce la canción (<canción>-<artista>): \")\n",
    "        cancion = Cancion(*cancion.split(\"-\"))\n",
    "        playlist.reproducir_por_nombre(cancion)\n",
    "        self.siguiente_cancion()\n",
    "\n",
    "    def reproducir_al_azar(self, playlist):\n",
    "        playlist.reproducir_al_azar()\n",
    "        self.siguiente_cancion()\n",
    "\n",
    "    # NO MODIFICAR DE AQUÍ HACIA ABAJO\n",
    "    # El resto son más menús y funciones auxiliares\n",
    "\n",
    "    def menu_reproducir_playlist(self):\n",
    "\n",
    "        playlist = self.playlists[self.elegir_playlists()]\n",
    "        self.playlist_actual = playlist\n",
    "        if playlist.existen_canciones():\n",
    "            playlist.mostrar_canciones()\n",
    "            opciones_reproducir_playlist = {\n",
    "                1: self.reproducir_por_nombre,\n",
    "                2: self.reproducir_al_azar\n",
    "            }\n",
    "\n",
    "            print(\"\\n\")\n",
    "            print(\"¿Qué quieres hacer?\")\n",
    "            print(\"-\" * 40)\n",
    "            print(\"1. Reproducir por nombre de canción\")\n",
    "            print(\"2. Reproducir al azar\")\n",
    "            print(\"-\" * 40 + \"\\n\")\n",
    "            opc = int(input(\"Elige una opción por su número: \"))\n",
    "            return opciones_reproducir_playlist[opc](playlist)\n",
    "        else:\n",
    "            print(\"-\" * 40)\n",
    "            print(\"La playlist está vacía\")\n",
    "            print(\"-\" * 40 + \"\\n\")\n",
    "\n",
    "    def menu_agregar_playlist(self):\n",
    "        canciones = set()\n",
    "        continuar = True\n",
    "        print(\"\\n\")\n",
    "        print(\"-\" * 40)\n",
    "        while continuar:\n",
    "            print(\"(deja vacío para continuar)\")\n",
    "            cancion = input(\"Introduce la canción (<canción>-<artista>): \")\n",
    "            if cancion == \"\":\n",
    "                continuar = False\n",
    "            else:\n",
    "                nombre, artista = cancion.split(\"-\")\n",
    "                canciones.add(Cancion(nombre, artista))\n",
    "\n",
    "        print(\"\\n\")\n",
    "        print(\"-\" * 40)\n",
    "        nombre_playlist = input(\"Introduce el nombre de la playlist: \")\n",
    "        nueva_playlist = Playlist(list(canciones))\n",
    "        self.playlists[nombre_playlist] = nueva_playlist\n",
    "\n",
    "    def menu_editar_playlist(self):\n",
    "        if len(self.playlists):\n",
    "            playlist = self.playlists[self.elegir_playlists()]\n",
    "            playlist.mostrar_canciones()\n",
    "            opciones_reproducir_playlist = {\n",
    "                1: self.menu_agregar_cancion,\n",
    "                2: self.menu_eliminar_cancion\n",
    "            }\n",
    "            print(\"\\n\")\n",
    "            print(\"¿Qué quieres hacer?\")\n",
    "            print(\"-\" * 40)\n",
    "            print(\"1. Agregar canción\")\n",
    "            print(\"2. Eliminar canción\")\n",
    "            print(\"-\" * 40 + \"\\n\")\n",
    "            opc = int(input(\"Elige una opción por su número: \"))\n",
    "            return opciones_reproducir_playlist[opc](playlist)\n",
    "        else:\n",
    "            print(\"-\" * 40)\n",
    "            print(\"No hay playlists aún\")\n",
    "            print(\"-\" * 40 + \"\\n\")\n",
    "            return\n",
    "\n",
    "    def menu_agregar_cancion(self, playlist):\n",
    "        cancion = input(\"Introduce la canción (<canción>-<artista>): \")\n",
    "        cancion = Cancion(*cancion.split(\"-\"))\n",
    "        self.agregar_cancion(playlist, cancion)\n",
    "\n",
    "    def menu_eliminar_cancion(self, playlist):\n",
    "        cancion = input(\"Introduce la canción (<canción>-<artista>): \")\n",
    "        cancion = Cancion(*cancion.split(\"-\"))\n",
    "        self.eliminar_cancion(playlist, cancion)\n",
    "\n",
    "    def agregar_cancion(self, playlist, cancion):\n",
    "        playlist.agregar_cancion(cancion)\n",
    "\n",
    "    def eliminar_cancion(self, playlist, cancion):\n",
    "        playlist.eliminar_cancion(cancion)\n",
    "\n",
    "    def menu_fusionar_playlists(self):\n",
    "        if len(self.playlists) > 1:\n",
    "            print(\"\\n\")\n",
    "            print(\"-\" * 40)\n",
    "            print(\"Playlist 1\")\n",
    "            playlist1 = self.playlists[self.elegir_playlists()]\n",
    "            print(\"Playlist 2\")\n",
    "            playlist2 = self.playlists[self.elegir_playlists()]\n",
    "            self.fusionar_playlists(playlist1, playlist2)\n",
    "        else:\n",
    "            print(\"-\" * 40)\n",
    "            print(\"No tienes suficientes playlists aún\")\n",
    "            print(\"-\" * 40 + \"\\n\")\n",
    "            return\n",
    "\n",
    "\n",
    "# Flujo del programa\n",
    "canciones = IIC2233Tunes()\n",
    "canciones.ejecutar()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DCCafeteria"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['espresso', 'frappuccino', 'cold_brew', 'te_chai', 'earl_gray', 'americano', 'cappuccino']\n",
      "['frappuccino', 'cold_brew']\n",
      "['espresso', 'earl_gray', 'americano']\n"
     ]
    }
   ],
   "source": [
    "from collections import namedtuple\n",
    "from functools import reduce\n",
    "from itertools import tee\n",
    "\n",
    "Producto = namedtuple('Producto', 'nombre, precio, categoria')\n",
    "\n",
    "# NO MODIFICAR\n",
    "def cargar_productos(ruta):\n",
    "    with open(ruta, 'r') as archivo:\n",
    "        linea = archivo.readline()\n",
    "        for linea in archivo:\n",
    "            nombre, precio, categoria = linea.strip('\\n').split(',')\n",
    "            precio = int(precio)\n",
    "            yield Producto(nombre, precio, categoria)\n",
    "\n",
    "'''\n",
    "Retorna un generador con el nombre de todos los productos.\n",
    "'''\n",
    "def obtener_productos(generador_productos):\n",
    "    # COMPLETAR\n",
    "    nombres_productos = map(lambda prod: prod.nombre, generador_productos)\n",
    "    return nombres_productos\n",
    "\n",
    "\n",
    "'''\n",
    "Retorna un generador con todos los nombres de los Productos \n",
    "pertenecientes a la categoría indicada.\n",
    "'''\n",
    "def filtrar_por_categoria(generador_productos,\n",
    "                          nombre_categoria):\n",
    "    # COMPLETAR\n",
    "    productos_filtrados = map(\n",
    "        lambda cat: cat.nombre,\n",
    "        filter(lambda prod: prod.categoria == nombre_categoria, generador_productos)\n",
    "    )\n",
    "\n",
    "    return productos_filtrados\n",
    "\n",
    "\n",
    "'''\n",
    "Retorna un generador con el nombres del Producto más económico,\n",
    "en caso de haber más de uno, debe retornarlos todos.\n",
    "'''\n",
    "def buscar_mas_barato(generador_productos):\n",
    "    # NO MODIFICAR\n",
    "    generador_copia_1, generador_copia_2 = tee(generador_productos, 2)\n",
    "    \n",
    "    # COMPLETAR\n",
    "    menor_precio = reduce(lambda x, y: x if x.precio < y.precio else y, generador_copia_1)\n",
    "    productos_mas_baratos = filter(lambda prod: prod.precio == menor_precio.precio, generador_copia_2)\n",
    "    nombres_productos_mas_baratos = map(lambda prod: prod.nombre, productos_mas_baratos)\n",
    "\n",
    "    return nombres_productos_mas_baratos\n",
    "\n",
    "\n",
    "generador_productos = cargar_productos('dcccafe.txt')\n",
    "print(list(obtener_productos(generador_productos)))\n",
    "\n",
    "generador_productos = cargar_productos('dcccafe.txt')\n",
    "print(list(filtrar_por_categoria(generador_productos, 'cafe_frio')))\n",
    "\n",
    "generador_productos = cargar_productos('dcccafe.txt')\n",
    "print(list(buscar_mas_barato(generador_productos)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# DCCabify"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[['Matias Rio', '988944932', '14000'], ['Juan Perez', '977289042', '4000'], ['Antonia Karaga', '955732136', '4000'], ['Lucas Kirten', '945413671', '13000'], ['Rodrigo Ester', '955817390', '15000'], ['Martin Alen', '970806826', '3000'], ['Karen Estefan', '991223668', '2000'], ['Cristobal Quilin', '922031909', '15000'], ['Fernanda Paredes', '943409151', '15000'], ['Pamela Josin', '932432121', '24000']]\n",
      "{'Rodrigo Ester', 'Matias Rio', 'Lucas Kirten', 'Pamela Josin', 'Cristobal Quilin', 'Fernanda Paredes'}\n",
      "16000\n",
      "977289042\n",
      "955732136\n",
      "970806826\n",
      "991223668\n",
      "988944932\n",
      "945413671\n",
      "955817390\n",
      "922031909\n",
      "943409151\n",
      "932432121\n"
     ]
    }
   ],
   "source": [
    "from functools import reduce\n",
    "import os\n",
    "\n",
    "class DCCAplicacion:\n",
    "    \n",
    "    def __init__(self, ruta_archivo):\n",
    "        self.ruta_archivo = ruta_archivo\n",
    "        \n",
    "    def leer_archivo(self):\n",
    "        archivo = open(self.ruta_archivo)\n",
    "        self.leido = list(set(archivo.readlines()))\n",
    "        for indice in range(0,len(self.leido)):\n",
    "            nuevo = self.leido[indice].rstrip(\"\\n\").split(\"|\")\n",
    "            self.leido[indice] = nuevo\n",
    "        self.leido.remove(['Nombre', 'Numero', 'Gasto_por_semana'])\n",
    "        \n",
    "    def arreglar_archivo(self):\n",
    "        self.nueva_lista = []\n",
    "        for elemento in self.leido:\n",
    "            if elemento[0] != \"NULL\" and elemento[1] != \"NULL\" and elemento[2] != \"NULL\":\n",
    "                self.nueva_lista.append(elemento)\n",
    "        print(self.nueva_lista)\n",
    "        \n",
    "    def nombres_gasto(self):\n",
    "        filtrado = filter(lambda x: int(x[2])>=10000,self.nueva_lista)\n",
    "        self.nombres = set()\n",
    "        for elemento in filtrado:\n",
    "            self.nombres.add(elemento[0])\n",
    "        print(self.nombres)\n",
    "        \n",
    "    def promedio_gasto(self):\n",
    "        filtrado_2 = filter(lambda x: int(x[2])>=10000,self.nueva_lista)\n",
    "        numeros = [int(x[2]) for x in filtrado_2]\n",
    "        promedio_filtrado = reduce(lambda x,y: x+y, numeros)\n",
    "        promedio = promedio_filtrado/len(numeros)\n",
    "        print(int(promedio))\n",
    "        \n",
    "    def recorrer_especifico(self,objetivo):\n",
    "        \n",
    "        if objetivo == \"menor\":\n",
    "            \n",
    "            filtar_menores = filter(lambda x: int(x[2])<10000,self.nueva_lista)\n",
    "            return (elemento[1] for elemento in filtar_menores)\n",
    "            \n",
    "        elif objetivo == \"mayor\":\n",
    "            \n",
    "            filtrar_mayores = filter(lambda x: int(x[2])>=10000,self.nueva_lista)\n",
    "            return (elemento[1] for elemento in filtrar_mayores)\n",
    "            \n",
    "            \n",
    "        \n",
    "ruta = os.path.join(\"clientes\",\"clientes.txt\")\n",
    "clase = DCCAplicacion(ruta)\n",
    "clase.leer_archivo()\n",
    "clase.arreglar_archivo()\n",
    "clase.nombres_gasto()\n",
    "clase.promedio_gasto()\n",
    "generador_menor = clase.recorrer_especifico(\"menor\")\n",
    "generador_mayor = clase.recorrer_especifico(\"mayor\")\n",
    "for elemento in generador_menor:\n",
    "    print(elemento)\n",
    "for elemento in generador_mayor:\n",
    "    print(elemento)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
