From 13b4f486c5462af6d2ffe76629cfc396ca510333 Mon Sep 17 00:00:00 2001 From: Henrique Branco Date: Sat, 27 Jul 2024 23:08:45 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20in=C3=ADcio=20cap=C3=ADtulo=20dicion?= =?UTF-8?q?=C3=A1rios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../04-dicionarios.ipynb | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 book/06-estruturas-de-dados/04-dicionarios.ipynb diff --git a/book/06-estruturas-de-dados/04-dicionarios.ipynb b/book/06-estruturas-de-dados/04-dicionarios.ipynb new file mode 100644 index 0000000..8686077 --- /dev/null +++ b/book/06-estruturas-de-dados/04-dicionarios.ipynb @@ -0,0 +1,219 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Dicionários" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Definição" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Um dicionário em Python é uma estrutura de dados que armazena pares de chave-valor. É a primeira estrutura **não ordenada** que vamos aprender.\n", + "\n", + "Cada chave deve ser única e imutável (por exemplo, uma string, um número ou uma tupla), enquanto os valores podem ser de qualquer tipo, incluindo listas, listas e até mesmo outros dicionários. \n", + "\n", + "Os dicionários são úteis para armazenar dados que precisam ser rapidamente acessíveis por uma chave descritiva." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sintaxe básica" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Um dicionário é definido usando chaves `{}` e cada par de chave-valor é separado por dois pontos `:`. Os pares são separados por vírgulas `,`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'nome': 'João', 'idade': 30, 'cidade': 'São Paulo'}\n" + ] + } + ], + "source": [ + "pessoa = {\n", + " \"nome\": \"João\",\n", + " \"idade\": 30,\n", + " \"cidade\": \"São Paulo\"\n", + "}\n", + "print(pessoa)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operações básicas com dicionários" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Acessando valores a partir da chave" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lembra que listas e tuplas podemos acessar os elementos pela índice? Pois bem, em dicionário é como se nós déssemos nomes aos índices. Os índices passam a ser as nossas chaves. E ao acessarmos a chave de um dicionário o valor é retornado." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "João\n" + ] + } + ], + "source": [ + "pessoa = {\n", + " \"nome\": \"João\",\n", + " \"idade\": 30,\n", + " \"cidade\": \"São Paulo\"\n", + "}\n", + "print(pessoa[\"nome\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note que não existe mais o acesso por índices ou posições, como era em listas e tuplas. Por este motivo, os dicionários são estruturas **não ordenadas**. Não há uma ordem (primeiro, segundo, terceiro) para acessarmos os valores. Vejamos o que acontece caso busquemos pelo primeiro par de chaves e valores através de índices:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [ + { + "ename": "KeyError", + "evalue": "0", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[3], line 6\u001b[0m\n\u001b[0;32m 1\u001b[0m pessoa \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 2\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnome\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mJoão\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 3\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124midade\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;241m30\u001b[39m,\n\u001b[0;32m 4\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcidade\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSão Paulo\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 5\u001b[0m }\n\u001b[1;32m----> 6\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mpessoa\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m)\n", + "\u001b[1;31mKeyError\u001b[0m: 0" + ] + } + ], + "source": [ + "pessoa = {\n", + " \"nome\": \"João\",\n", + " \"idade\": 30,\n", + " \"cidade\": \"São Paulo\"\n", + "}\n", + "print(pessoa[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Esse erro `KeyError: 0` indica que ele buscou pelo 0 (zero) nas chaves do meu dicionário, mas de fato eu não tenho. Eu só tenho `nome`, `idade` e `cidade`. Em resumo, o erro significa \"chave 0 não encontrada\"." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Modificando o dicionário" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Dicionários são mutáveis assim como listas. Ou seja, uma vez criado, eu consigo modificar seus valores, bem como acrescentar ou remover outros pares de chave e valor.\n", + "\n", + "Se buscarmos por uma chave, por exemplo, `profissao`, no dicionário `pessoa` criado acima através da notação `pessoa[\"profissao\"]` vamos receber a mensagem de erro `KeyError: 'profissão'`, conforme já vimos. Porém, podemos atribuir um valor a esta chave inexistente, e ela será criada.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# pessoa não possui a chave profissão\n", + "pessoa = {\n", + " \"nome\": \"João\",\n", + " \"idade\": 30,\n", + " \"cidade\": \"São Paulo\"\n", + "}\n", + "\n", + "# Aqui não estamos acessando a chave profissão, mas sim criando-a!\n", + "pessoa[\"profissao\"] = \"desenvolvedor\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{admonition} Nota (acessar vs atribuir)\n", + ":class: note\n", + "\n", + "Lembre-se que acessar um valor é diferente de atribuir um valor à uma chave. O acesso requer que a chave exista, e a atribuição, caso a chave não exista, ela será criada.\n", + "```\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}