{ "cells": [ { "cell_type": "markdown", "id": "ee00f5ad-157b-411c-b460-cd42c80de692", "metadata": {}, "source": [ "<figure>\n", "<img src=\"../Imagenes/logo-final-ap.png\" width=\"80\" height=\"80\" align=\"left\"/> \n", "</figure>\n", "\n", "# <span style=\"color:#4361EE\"><left>Aprendizaje Profundo</left></span>" ] }, { "cell_type": "markdown", "id": "54c39c57-aabd-4111-86ec-29bd9e10167f", "metadata": {}, "source": [ "# <span style=\"color:red\"><center>Diplomado en Inteligencia Artificial y Aprendizaje Profundo</center></span>" ] }, { "cell_type": "markdown", "id": "04b97205", "metadata": {}, "source": [ "# <span style=\"color:green\"><center>Diccionarios</center></span>\n" ] }, { "cell_type": "markdown", "id": "1894a340", "metadata": {}, "source": [ "<figure>\n", "<center>\n", "<img src=\"https://raw.githubusercontent.com/AprendizajeProfundo/Alejandria/main/Archivos_Generales/Imagenes/Diccionario.jpg\" width=\"600\" height=\"400\" align=\"center\" /> \n", "</center> \n", "</figure>\n", "<center>\n", "\n", "Fuente: [Pexels](https://www.pexels.com/es-es/foto/diccionario-de-texto-en-efecto-bokeh-267669/)\n", "\n", "</center>\n" ] }, { "cell_type": "markdown", "id": "cd60e44d", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Profesores</span>" ] }, { "cell_type": "markdown", "id": "4dcdd021", "metadata": {}, "source": [ "1. Alvaro Montenegro, PhD, ammontenegrod@unal.edu.co\n", "1. Camilo José Torres Jiménez, Msc, cjtorresj@unal.edu.co\n", "1. Daniel Montenegro, Msc, dextronomo@gmail.com " ] }, { "cell_type": "markdown", "id": "1e149ea9", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Asesora Medios y Marketing digital</span>" ] }, { "cell_type": "markdown", "id": "bedabf45", "metadata": {}, "source": [ "4. Maria del Pilar Montenegro, pmontenegro88@gmail.com\n", "5. Jessica López Mejía, jelopezme@unal.edu.co" ] }, { "cell_type": "markdown", "id": "e35cf6f5", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Jefe Jurídica</span>" ] }, { "cell_type": "markdown", "id": "3ae28633", "metadata": {}, "source": [ "6. Paula Andrea Guzmán, guzmancruz.paula@gmail.com" ] }, { "cell_type": "markdown", "id": "101df433", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Coordinador Jurídico</span>" ] }, { "cell_type": "markdown", "id": "55d3d6fc", "metadata": {}, "source": [ "7. David Fuentes, fuentesd065@gmail.com" ] }, { "cell_type": "markdown", "id": "6517a8b4", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Desarrolladores Principales</span>" ] }, { "cell_type": "markdown", "id": "314b19df", "metadata": {}, "source": [ "8. Dairo Moreno, damoralesj@unal.edu.co\n", "9. Joan Castro, jocastroc@unal.edu.co\n", "10. Bryan Riveros, briveros@unal.edu.co\n", "11. Rosmer Vargas, rovargasc@unal.edu.co\n", "12. Venus Puertas, vpuertasg@unal.edu.co" ] }, { "cell_type": "markdown", "id": "18dd69a0", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Expertos en Bases de Datos</span>" ] }, { "cell_type": "markdown", "id": "d92a5029", "metadata": {}, "source": [ "13. Giovvani Barrera, udgiovanni@gmail.com\n", "14. Camilo Chitivo, cchitivo@unal.edu.co" ] }, { "cell_type": "markdown", "id": "public-tuition", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Introducción</span>" ] }, { "cell_type": "markdown", "id": "settled-heavy", "metadata": { "colab_type": "text", "id": "Qwzm74tvByHP" }, "source": [ "En esta lección revisamos los conjuntos, los cuales son iterables que se basa en el paradigma `clave-valor`, que resultan esenciales para el tratamiento avanzado de datos. Un diccionario tiene una estructura casi idéntica a un archivo de tipo [JSON](https://es.wikipedia.org/wiki/JSON), aunque son estructuras de datos diferentes. Por otro lado, si aprende manipular los diccionarios en Python, ya sabe el 95% de lo que son los archivos JSON." ] }, { "cell_type": "markdown", "id": "global-daily", "metadata": {}, "source": [ "## <span style=\"color:#4361EE\">Diccionarios </span>" ] }, { "cell_type": "markdown", "id": "radio-woman", "metadata": {}, "source": [ "Los diccionarios se distinguen por estar encapsulados en corchetes {} y poseer el concepto de clave, valor e ítem.\n", "\n", "**Consideraciones importantes:**\n", "\n", "En **contraste con las listas**, los elementos del diccionario no se acceden vía índices, sino vía claves (**keys**) que se definen. \n", "\n", "Los diccionarios son objetos iterables, pero no son ordenados. Por esa razón no pueden ser accesados por un índice, como las listas y las tuplas.\n", "\n", "Revisemos el siguiente ejemplo:" ] }, { "cell_type": "code", "execution_count": 1, "id": "loose-genius", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Leticia': 'Amazonas', 'Montería': 'Sinu', 'Bogotá': ['Bogotá', 'Tunjelito'], 'San Gil': 'Fonce', 'Honda': 'Magdalena'}\n" ] } ], "source": [ "Rios = {\n", "... 'Leticia' : 'Amazonas',\n", "... 'Montería': 'Sinu',\n", "... 'Bogotá' : ['Bogotá', 'Tunjelito'],\n", "... 'San Gil': 'Fonce',\n", "... 'Honda' : 'Magdalena'\n", "... }\n", "\n", "print(Rios)" ] }, { "cell_type": "markdown", "id": "172c99bb-685c-4e55-8f67-42172dd74427", "metadata": {}, "source": [ "El objeto *Rios* es un diccionario. Observe que la estructura del diccionario es\n", "\n", "+ {clave:valor, clave:valor, ...}\n", "\n", "En el ejemplo:\n", "\n", "* las claves son: 'Leticia', 'Montería', 'Bogotá', 'San Gil', 'Honda'. \n", "* Los respectivos valores son: 'Amazonas', 'Sinu', ['Bogotá', 'Tunjuelito'], 'Fonce', 'Magdalena'." ] }, { "cell_type": "markdown", "id": "scheduled-champion", "metadata": {}, "source": [ "Note lo que ocurre cuando intentamos acceder por medio de índices (posiciones):" ] }, { "cell_type": "code", "execution_count": 2, "id": "extreme-suffering", "metadata": {}, "outputs": [ { "ename": "KeyError", "evalue": "0", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn [2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mRios\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m)\n", "\u001b[0;31mKeyError\u001b[0m: 0" ] } ], "source": [ "print(Rios[0])" ] }, { "cell_type": "code", "execution_count": 5, "id": "df4d01a4-2b39-4855-a23e-b8b811c58023", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Los rios de Montería son: Sinu\n", "Los rios de Bogotá son: ['Bogotá', 'Tunjelito']\n" ] } ], "source": [ "print('Los rios de Montería son:', Rios['Montería'])\n", "print('Los rios de Bogotá son:', Rios['Bogotá'])" ] }, { "cell_type": "markdown", "id": "exempt-buddy", "metadata": {}, "source": [ "También es posible crear un diccionario usando la función por defecto (built-in) `dict()`, usando una lista de tuplas:" ] }, { "cell_type": "code", "execution_count": null, "id": "bacterial-bracelet", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Colores': ['Negro', 'Rojo', 'Azul'], 'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias']}\n" ] } ], "source": [ "my_dic=dict([\n", " ('Colores', ['Negro','Rojo','Azul']),\n", " ('Animales', 'Gato'),\n", " ('Calzado', ['Botas','Botines','Deportivos','Sandalias'])\n", " ])\n", "\n", "print(my_dic)" ] }, { "cell_type": "markdown", "id": "alike-guest", "metadata": {}, "source": [ "Veamos el tipo de dato que es un diccionario." ] }, { "cell_type": "code", "execution_count": null, "id": "controversial-cache", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "<class 'dict'>\n" ] } ], "source": [ "print(type(my_dic))" ] }, { "cell_type": "markdown", "id": "electoral-efficiency", "metadata": {}, "source": [ "Veamos por ejemplo, los ítems que pertenecen a la llave **Colores**" ] }, { "cell_type": "code", "execution_count": null, "id": "fantastic-decision", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Negro', 'Rojo', 'Azul']\n" ] } ], "source": [ "print(my_dic['Colores'])\n" ] }, { "cell_type": "markdown", "id": "substantial-swift", "metadata": {}, "source": [ "Una vez ingresado a los ítem del diccionario, en caso de ser listas, podemos acceder a sus elementos tal cual lo hacemos con las listas (por sus índices)" ] }, { "cell_type": "code", "execution_count": null, "id": "digital-leadership", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rojo\n" ] } ], "source": [ "print(my_dic['Colores'][1])" ] }, { "cell_type": "code", "execution_count": null, "id": "sunrise-martin", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ví pasar un Gato con Botas de color Negro\n" ] } ], "source": [ "print('Ví pasar un',my_dic['Animales'],'con',my_dic['Calzado'][0],'de color',my_dic['Colores'][0])" ] }, { "cell_type": "markdown", "id": "smaller-irish", "metadata": {}, "source": [ "**Nota:** Si las llaves son strings sencillas (sin espacios), también es posible definir un diccionario de la siguiente manera:" ] }, { "cell_type": "code", "execution_count": 13, "id": "subtle-radical", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Colores': ['Negro', 'Rojo', 'Azul'], 'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias']}\n" ] } ], "source": [ "my_dic=dict(\n", " Colores = ['Negro','Rojo','Azul'],\n", " Animales= 'Gato',\n", " Calzado =['Botas','Botines','Deportivos','Sandalias']\n", " )\n", "\n", "print(my_dic)" ] }, { "cell_type": "markdown", "id": "caring-tennis", "metadata": {}, "source": [ "Claro está, si se intenta acceder a una llave incorrecta, obtendremos el siguiente error:" ] }, { "cell_type": "code", "execution_count": null, "id": "supported-loading", "metadata": {}, "outputs": [ { "ename": "KeyError", "evalue": "'Valor'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m<ipython-input-35-fe7f2260447b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmy_dic\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Valor'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyError\u001b[0m: 'Valor'" ] } ], "source": [ "print(my_dic['Valor'])" ] }, { "cell_type": "markdown", "id": "recognized-server", "metadata": {}, "source": [ "Podemos agregar, modificar y eliminar valores de un diccionario:" ] }, { "cell_type": "markdown", "id": "accomplished-bennett", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Agregar ítems al diccionario</span>\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "focused-hunger", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Colores': ['Negro', 'Rojo', 'Azul'], 'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias'], 'Valor': ['20', '50', '12']}\n" ] } ], "source": [ "my_dic['Valor']=['20','50','12']\n", "print(my_dic)" ] }, { "cell_type": "markdown", "id": "accompanied-memphis", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Modificar valores:</span>\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "ruled-berlin", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Colores': 'Negro', 'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias'], 'Valor': ['20', '50', '12']}\n" ] } ], "source": [ "my_dic['Colores']='Negro'\n", "print(my_dic)" ] }, { "cell_type": "markdown", "id": "pleasant-arnold", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Eliminar valores:</span>\n" ] }, { "cell_type": "code", "execution_count": 16, "id": "thermal-venezuela", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Colores': 'Negro', 'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias']}\n" ] } ], "source": [ "del my_dic['Valor']\n", "print(my_dic)" ] }, { "cell_type": "markdown", "id": "registered-batch", "metadata": {}, "source": [ "La razón por la cuál no es permitido acceder a los ítems de los diccionarios con índices, es porque los diccionarios no tienen orden. Adicionalmente valores numéricos pueden ser claves en un diccionario.\n", "\n", "Las `claves son inmutables` en los diccionarios." ] }, { "cell_type": "code", "execution_count": 6, "id": "induced-terror", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{135: 'Coco', 1: 'Urban_Sound8k', 2: 'Mnist', 3: 'CheXpert'}\n" ] } ], "source": [ "d = {135: 'Coco', 1: 'Urban_Sound8k', 2: 'Mnist', 3: 'CheXpert'}\n", "print(d)" ] }, { "cell_type": "code", "execution_count": 7, "id": "genetic-component", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Coco'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d[135]" ] }, { "cell_type": "markdown", "id": "engaged-unemployment", "metadata": {}, "source": [ "Puede ser confuso al principio, confundir estas llaves con índices. Incluso se podría pensar en tomar rebanadas de él sin éxito o agregar valores como se hace en las listas:" ] }, { "cell_type": "code", "execution_count": 8, "id": "forced-spice", "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "unhashable type: 'slice'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn [8], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43md\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m:\u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m]\u001b[49m\n", "\u001b[0;31mTypeError\u001b[0m: unhashable type: 'slice'" ] } ], "source": [ "d[0:2]" ] }, { "cell_type": "markdown", "id": "d9f73727", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Ejercicio</span>\n" ] }, { "cell_type": "markdown", "id": "wooden-syntax", "metadata": {}, "source": [ "Investigue que significa unhashable. Busque la función `hash()` y úsela en este contexto." ] }, { "cell_type": "code", "execution_count": 9, "id": "prepared-meeting", "metadata": {}, "outputs": [ { "ename": "AttributeError", "evalue": "'dict' object has no attribute 'append'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn [9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43md\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mappend\u001b[49m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mYolo\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mAttributeError\u001b[0m: 'dict' object has no attribute 'append'" ] } ], "source": [ "d.append('Yolo')" ] }, { "cell_type": "markdown", "id": "7f5040a7", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Propiedades de los diccionarios</span>\n" ] }, { "cell_type": "markdown", "id": "architectural-district", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Dinámicos</span>\n" ] }, { "cell_type": "markdown", "id": "constant-lawrence", "metadata": {}, "source": [ "Este concepto es muy importante, pues resalta la capacidad de un diccionario en incrementar su tamaño sin generar error:" ] }, { "cell_type": "code", "execution_count": 17, "id": "brazilian-eight", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "<class 'dict'>\n", "{'Nombre': 'Gengis', 'Apellido': 'Khan', 'Edad': 23, 'Esposa': ['Börte Qatun', 'Yesugen', 'Qulan Qatun', 'Möge Qatun', 'Juerbiesu', 'Ibaqa Beki'], 'Hijos': 'En estudio', 'Mascotas': {'Perro': 'Wahadi', 'Gato': 'Gotze', 'Leon': 'Pichirilo'}}\n", "Hijos de Gengis : En estudio\n" ] } ], "source": [ "#Generar diccionario vacío\n", "persona = {}\n", "print(type(persona))\n", "\n", "# Agregar llaves y sus definiciones (items)\n", "persona['Nombre'] = 'Gengis'\n", "persona['Apellido'] = 'Khan'\n", "persona['Edad'] = 23\n", "persona['Esposa'] = ['Börte Qatun','Yesugen','Qulan Qatun','Möge Qatun','Juerbiesu','Ibaqa Beki']\n", "persona['Hijos'] = 'En estudio'\n", "persona['Mascotas'] = {'Perro': 'Wahadi', 'Gato': 'Gotze','Leon':'Pichirilo'}\n", "\n", "print(persona)\n", "print('Hijos de',persona['Nombre'],':',persona['Hijos'])" ] }, { "cell_type": "markdown", "id": "07b1c73c", "metadata": {}, "source": [ "```{admonition} Nota\n", ":class: note\n", "Del ejemplo anterior se puede observar que los diccionarios pueden contener diccionarios en su interior:\n", "```\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "micro-airline", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Perro': 'Wahadi', 'Gato': 'Gotze', 'Leon': 'Pichirilo'}\n" ] } ], "source": [ "print(persona['Mascotas'])" ] }, { "cell_type": "code", "execution_count": 19, "id": "limiting-occasion", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wahadi\n" ] } ], "source": [ "print(persona['Mascotas']['Perro'])" ] }, { "cell_type": "markdown", "id": "77fe8d91", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Claves</span>\n" ] }, { "cell_type": "markdown", "id": "adopted-davis", "metadata": {}, "source": [ "No hay restricciones en la forma de definir las llaves:" ] }, { "cell_type": "code", "execution_count": null, "id": "lucky-receiver", "metadata": {}, "outputs": [], "source": [ "foo = {42: 'aaa', 2.78: 'bbb', False: 'cc'}" ] }, { "cell_type": "code", "execution_count": null, "id": "collaborative-phenomenon", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'cc'" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "foo[False]" ] }, { "cell_type": "code", "execution_count": null, "id": "removed-memory", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = {int: 1, float: 2, bool: 3}\n", "\n", "d[int]" ] }, { "cell_type": "markdown", "id": "introductory-memorabilia", "metadata": {}, "source": [ "Sin embargo, las claves son únicases decir, no se pueden repetir:" ] }, { "cell_type": "code", "execution_count": 11, "id": "cloudy-ideal", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{42: 'aaa', 2.78: 'bbb', False: 'dodo'}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "foo = {42: 'aaa', 2.78: 'bbb', False: 'cc',False:'dodo'}\n", "foo" ] }, { "cell_type": "markdown", "id": "61f4d609", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Ejercicio</span>\n" ] }, { "cell_type": "markdown", "id": "31cec6c5-e4d5-49aa-a6db-7c5efa891c99", "metadata": {}, "source": [ "Defina un diccionario de al menos 4 claves de tal manera que esas llaves sean tuplas. Acceda a cada elemento. ¿Puede hacer lo mismo para una clave que sea definida como lista o diccionario?" ] }, { "cell_type": "markdown", "id": "8632df1d", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Operadores y Métodos:</span>\n" ] }, { "cell_type": "markdown", "id": "facial-provincial", "metadata": {}, "source": [ "Es posible utilizar algunos operadores sobre los diccionarios para verificar su estado (por ejemplo, si están o no están disponibles sin generar errores):" ] }, { "cell_type": "code", "execution_count": 20, "id": "reported-norwegian", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'Animales' in my_dic" ] }, { "cell_type": "code", "execution_count": 21, "id": "comfortable-fence", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'Colores' not in my_dic" ] }, { "cell_type": "markdown", "id": "descending-magazine", "metadata": {}, "source": [ "También podemos usar lógica aristotélica (tablas de verdad) para chequear cosas sin tener errores:" ] }, { "cell_type": "code", "execution_count": null, "id": "subsequent-first", "metadata": {}, "outputs": [], "source": [ "#my_dic['Valor']" ] }, { "cell_type": "code", "execution_count": null, "id": "solid-diagnosis", "metadata": {}, "outputs": [], "source": [ "#'Valor' in my_dic and my_dic['Valor']" ] }, { "cell_type": "markdown", "id": "80cd5f41", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">len() sobre diccionarios</span>\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "wrapped-checklist", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Colores': 'Negro', 'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias']}\n", "\n", "El diccionario tiene 3 ítems\n" ] } ], "source": [ "print(my_dic)\n", "\n", "print(\"\\nEl diccionario tiene\",len(my_dic),'ítems')" ] }, { "cell_type": "markdown", "id": "5c88ff90", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Métodos</span>\n" ] }, { "cell_type": "markdown", "id": "sharp-chambers", "metadata": {}, "source": [ "##### d.clear()" ] }, { "cell_type": "code", "execution_count": null, "id": "spanish-indie", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{<class 'int'>: 1, <class 'float'>: 2, <class 'bool'>: 3}\n", "{}\n" ] } ], "source": [ "print(d)\n", "d.clear()\n", "print(d)" ] }, { "cell_type": "markdown", "id": "light-liquid", "metadata": {}, "source": [ "Una vez ingresado a los ítem del diccionario, en caso de ser listas, podemos acceder a sus elementos tal cual lo hacemos con las listas (por sus índices)" ] }, { "cell_type": "markdown", "id": "intelligent-mumbai", "metadata": {}, "source": [ "##### d.get(\\<key>[, \\<default>])" ] }, { "cell_type": "code", "execution_count": 23, "id": "adequate-surgery", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Negro\n" ] } ], "source": [ "print(my_dic.get('Colores'))" ] }, { "cell_type": "code", "execution_count": 24, "id": "temporal-suspect", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Börte Qatun', 'Yesugen', 'Qulan Qatun', 'Möge Qatun', 'Juerbiesu', 'Ibaqa Beki']\n" ] } ], "source": [ "print(persona.get('Esposa'))" ] }, { "cell_type": "markdown", "id": "5cea60f6", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">items</span>\n" ] }, { "cell_type": "code", "execution_count": 25, "id": "qualified-distribution", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_items([('Colores', 'Negro'), ('Animales', 'Gato'), ('Calzado', ['Botas', 'Botines', 'Deportivos', 'Sandalias'])])\n" ] } ], "source": [ "print(my_dic.items())" ] }, { "cell_type": "code", "execution_count": null, "id": "spanish-denver", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[('Colores', 'Negro'), ('Animales', 'Gato'), ('Calzado', ['Botas', 'Botines', 'Deportivos', 'Sanadalias'])]\n" ] } ], "source": [ "print(list(my_dic.items()))" ] }, { "cell_type": "code", "execution_count": null, "id": "separated-strengthening", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Negro'" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(my_dic.items())[0][1]" ] }, { "cell_type": "markdown", "id": "apart-yellow", "metadata": {}, "source": [ "También existen otros métodos útiles. ¡Averigua para que sirve cada uno!\n", "\n", "- **d.keys()**\n", "- **d.values()**\n", "- **d.pop(\\<key>[, \\<default>])**\n", "- **d.popitem()**\n", "- **d.update(\\<obj>)**" ] }, { "cell_type": "markdown", "id": "4939da28-31de-415d-8924-7ef087f7479f", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Ejercicio</span>\n" ] }, { "cell_type": "markdown", "id": "c1ca71dd-3070-440d-bd50-9254448e34af", "metadata": {}, "source": [ "A partir de las siguientes líneas de código, entienda lo que hace cada uno de los métodos y cree sus propio ejemplo de mayor complejidad." ] }, { "cell_type": "code", "execution_count": 26, "id": "aggregate-recycling", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'Colores': 'Negro', 'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias']}\n" ] } ], "source": [ "print(my_dic)" ] }, { "cell_type": "code", "execution_count": 27, "id": "passing-attack", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_items([('Colores', 'Negro'), ('Animales', 'Gato'), ('Calzado', ['Botas', 'Botines', 'Deportivos', 'Sandalias'])])\n", "dict_keys(['Colores', 'Animales', 'Calzado'])\n", "dict_values(['Negro', 'Gato', ['Botas', 'Botines', 'Deportivos', 'Sandalias']])\n", "Negro\n", "{'Animales': 'Gato', 'Calzado': ['Botas', 'Botines', 'Deportivos', 'Sandalias']}\n", "('Calzado', ['Botas', 'Botines', 'Deportivos', 'Sandalias'])\n", "{'Animales': 'Gato'}\n", "None\n" ] } ], "source": [ "print(my_dic.items())\n", "print(my_dic.keys())\n", "print(my_dic.values())\n", "print(my_dic.pop('Colores'))\n", "print(my_dic)\n", "print(my_dic.popitem())\n", "print(my_dic)\n", "print(my_dic.update(persona))" ] }, { "cell_type": "markdown", "id": "7d53096d", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">char2int</span>\n" ] }, { "cell_type": "markdown", "id": "fifteen-unemployment", "metadata": {}, "source": [ "Como último ejemplo construimos un diccionario para el alfabeto, de tal manera que dado un caracter retorne un código asociado." ] }, { "cell_type": "code", "execution_count": null, "id": "frozen-better", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g': 6, 'h': 7, 'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'ñ': 14, 'o': 15, 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25, 'z': 26}\n", "\n", "\n", "char2int['c']= 2\n" ] } ], "source": [ "alfabeto = 'abcdefghijklmnñopqrstuvwxyz'\n", "alfaL = []\n", "for j in alfabeto:\n", " alfaL.append(j)\n", "\n", "\n", "char2int = {}\n", "num = list(range(len(alfabeto)))\n", "\n", "for car,val in zip(alfaL, num):\n", " char2int[car] = num[val]\n", "\n", "print(char2int)\n", "print('\\n')\n", "print('char2int[\\'c\\']=',char2int['c'])" ] }, { "cell_type": "markdown", "id": "63ec2ddd", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Métodos de los diccionarios</span>\n" ] }, { "cell_type": "markdown", "id": "understood-entrepreneur", "metadata": {}, "source": [ "|Método|Descripción |\n", "|---|---|\n", "|clear()|Elimina todos los elementos del diccionario.|\n", "|copy()|Devuelve una copia poco profunda del diccionario.|\n", "|get(clave[,valor])|Devuelve el valor de la clave. Si no existe, devuelve el valor valor si se indica y si no, None.|\n", "|items()|Devuelve una vista de los pares clave: valor del diccionario.|\n", "|keys()|Devuelve una vista de las claves del diccionario.|\n", "|pop(clave[,valor])|Devuelve el valor del elemento cuya clave es clave y elimina el elemento del diccionario. Si la clave no se encuentra, devuelve valor si se proporciona. Si la clave no se encuentra y no se indica valor, lanza la excepción KeyError.|\n", "|popitem()|Devuelve un par (clave, valor) aleatorio del diccionario. Si el diccionario está vacío, lanza la excepción KeyError.|\n", "|setdefault(clave[,valor])|Si la clave está en el diccionario, devuelve su valor. Si no lo está, inserta la clave con el valor valor y lo devuelve (si no se especifica valor, por defecto es None).|\n", "|update(iterable)|Actualiza el diccionario con los pares clave: valor del iterable.|\n", "|values()|Devuelve una vista de los valores del diccionario.|" ] }, { "cell_type": "markdown", "id": "1bafbd82-9ad1-49ad-83eb-ea58b35f0e39", "metadata": {}, "source": [ "### <span style=\"color:#4CC9F0\">Tips para manipulación de diccionarios</span>" ] }, { "cell_type": "markdown", "id": "5b6f5c10-e3c8-4ef2-9f5c-bedaea4a64cb", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Mezclar dos diccionarios</span>" ] }, { "cell_type": "code", "execution_count": 32, "id": "2a0fc09d-589c-4054-9da1-33b866690c35", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'a': 1, 'b': 2, 'c': 3, 'd': 4}\n" ] } ], "source": [ "dict1 = {'a': 1, 'b': 2}\n", "dict2 = {'c': 3, 'd': 4}\n", "\n", "dict3 = {**dict1, **dict2}\n", "\n", "print(dict3)" ] }, { "cell_type": "markdown", "id": "f144490a-5bb1-4db3-985b-e05aefea7c27", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Hacer la unión de dos diccionarios</span> " ] }, { "cell_type": "markdown", "id": "06e98fd7-42dd-439b-817e-b3e12f0948bb", "metadata": {}, "source": [ "Disponible desde Python 3.9" ] }, { "cell_type": "code", "execution_count": 34, "id": "1fc9c99c-3d44-46f2-ab55-e6efb134bb84", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'a': 1, 'b': 4, 'c': 3}\n" ] } ], "source": [ "dict1 = {'a':1, 'b':2}\n", "dict2 = {'c':3, 'b':4}\n", "\n", "dict3 = dict1 | dict2\n", "print(dict3)" ] }, { "cell_type": "markdown", "id": "889825db-48f1-4fc1-b752-56c05228c5c2", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Chequear si una clave existe en un diccionario</span> " ] }, { "cell_type": "code", "execution_count": 35, "id": "7f3c6443-9843-469e-baad-31dc33c106bd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "dict1 = {'a': 1, 'b': 2}\n", "\n", "print('a' in dict1)\n", "print('c' in dict1)\n" ] }, { "cell_type": "markdown", "id": "e548c8d0-72dd-4023-9795-fb055ddb457e", "metadata": { "tags": [] }, "source": [ "#### <span style=\"color:#4CC9F0\"> Remover un item de un diccionario</span> " ] }, { "cell_type": "markdown", "id": "687ba235-0718-408b-b129-1a46f24506a8", "metadata": {}, "source": [ "Revise las siguientes tres salidas y desarrolle su propio ejemplo." ] }, { "cell_type": "code", "execution_count": 36, "id": "20c4f99e-1b56-4930-9740-59cbc77839ca", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "Missing Key\n" ] }, { "ename": "KeyError", "evalue": "'d'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn [36], line 5\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(dict1\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ma\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(dict1\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mc\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mMissing Key\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m----> 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mdict1\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpop\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43md\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m)\n", "\u001b[0;31mKeyError\u001b[0m: 'd'" ] } ], "source": [ "dict1 = {'a': 1, 'b': 2}\n", "\n", "print(dict1.pop('a'))\n", "print(dict1.pop('c', 'Missing Key'))\n", "print(dict1.pop('d'))" ] }, { "cell_type": "markdown", "id": "013ba041-f46b-42d5-932a-da86431991d3", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Diccionarios por comprensión</span> " ] }, { "cell_type": "code", "execution_count": null, "id": "6c4b2ed1-4763-4c60-a6fb-f41c5050fd81", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}\n" ] } ], "source": [ "dict1 = {i:i**2 for i in range(1,11)}\n", "print(dict1)" ] }, { "cell_type": "markdown", "id": "3f539f75-2491-400d-8a9b-96444b183b4f", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Eliminar items vacios (None) en un diccionario</span> " ] }, { "cell_type": "code", "execution_count": null, "id": "d6a8e274-7ac9-416c-a34f-dc61ee1678d9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'a': 'manzana', 'b': 'banano'}\n" ] } ], "source": [ "dict1 = {'a': 'manzana', 'b': 'banano', 'c':None}\n", "\n", "dict1 = {key:value for (key, value) in dict1.items() if value is not None}\n", "print(dict1)\n" ] }, { "cell_type": "markdown", "id": "d8d97029-665f-45a5-b94d-7c2589cf4b79", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Uso de `get` para acceder a un ítem en un diccionario</span> " ] }, { "cell_type": "markdown", "id": "6371585c-e099-4246-bc17-b1c975b2cf13", "metadata": {}, "source": [ "Observe que con el uso de *get* no se genera un error cuando se intenta accesar una clave que no existe. En ese caso se recibe el valor `None`. Por el contrario se accesa directamente por la clave, se obtiene un error si la clave no existe en el diccionario." ] }, { "cell_type": "code", "execution_count": null, "id": "04a99c19-8e55-4399-9540-0c71845685b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n" ] }, { "ename": "KeyError", "evalue": "'c'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m<ipython-input-68-035bdafe920c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdict1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdict1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'c'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# Returns: None\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyError\u001b[0m: 'c'" ] } ], "source": [ "dict1 = {'a':1, 'b':2}\n", "\n", "print(dict1.get('c'))\n", "print(dict1['c'])\n", "\n", "# Returns: None\n", "# Returns: KeyError" ] }, { "cell_type": "markdown", "id": "86134d4b-9415-4bea-a4b5-96e8af18cb93", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\">Filtrar un diccionario</span> " ] }, { "cell_type": "markdown", "id": "a5094c7d-66a8-41e5-a428-9afd1202ff74", "metadata": {}, "source": [ "Se pueden obtener los ítems en un diccionario que cumplen con un criterio. En ejemplo se filtran las personas que miden 170 cm o más." ] }, { "cell_type": "code", "execution_count": null, "id": "df1f2832-db85-4eca-8a96-0e8bb0767ef7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'John': 175, 'María': 170}\n" ] } ], "source": [ "\n", "alturas = {'John': 175, 'Luis': 150, 'Carlos': 155, 'María': 170}\n", "\n", "alto = {key:value for (key, value) in alturas.items() if value >= 170}\n", "\n", "print(tall)" ] }, { "cell_type": "markdown", "id": "e49600b8-a079-460c-84f7-06913f9f2a5b", "metadata": {}, "source": [ "#### <span style=\"color:#4CC9F0\"> Iterando en un diccionario un diccionario</span> " ] }, { "cell_type": "markdown", "id": "36cca3c1-cc83-45c8-b2f5-ea69bbf84182", "metadata": {}, "source": [ "Vamos iterar a lo largo de un diccionario, primero por las claves y luego por los valores." ] }, { "cell_type": "code", "execution_count": null, "id": "e59e5623-ae17-4823-87b1-e010f073db56", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'León': 175, 'Luis': [150, 100], 'Carlos': 155, 'Angel': None}\n" ] } ], "source": [ "# creamos el diccionario\n", "\n", "salarios = {'León': 175, 'Luis': [150, 100], 'Carlos': 155, 'Angel': None}\n", "print(salarios)" ] }, { "cell_type": "code", "execution_count": null, "id": "f623f60c-2c98-4c64-a362-5442595d8c93", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "León\n", "Luis\n", "Carlos\n", "Angel\n" ] } ], "source": [ "# recorremos por claves\n", "\n", "for salario in salarios:\n", " print(salario)" ] }, { "cell_type": "code", "execution_count": null, "id": "ddc0cc62-bc1b-4286-86b9-3ab2a650d677", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "León\n", "Luis\n", "Carlos\n", "Angel\n" ] } ], "source": [ "# de nuevo por claves\n", "for persona in salarios.keys():\n", " print(persona)" ] }, { "cell_type": "code", "execution_count": null, "id": "52b41338-d286-4bb0-820d-cb72b76b283a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "175\n", "[150, 100]\n", "155\n", "None\n" ] } ], "source": [ "# recorremos por valores\n", "for salario in salarios.values():\n", " print(salario)" ] }, { "cell_type": "markdown", "id": "d6b0e21e-452a-4728-befe-d7b08ed51af1", "metadata": {}, "source": [ "<figure>\n", "<img src=\"../Imagenes/logo-final-ap.png\" width=\"80\" height=\"80\" align=\"right\"/> \n", "</figure>" ] } ], "metadata": { "interpreter": { "hash": "cf92aa13fedf815d5c8dd192b8d835913fde3e8bc926b2a0ad6cc74ef2ba3ca2" }, "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.9" } }, "nbformat": 4, "nbformat_minor": 5 }