{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dicionários em Python\n",
    "\n",
    "Um dicionário é semelhante a uma lista, mas você acessa valores através de uma **chave** em vez de um índice. Uma chave pode ser uma string ou um número. Os dicionários são delimitados por chaves **({})**, por exemplo:\n",
    "\n",
    "```python\n",
    "d = {'chave1' : 1, 'chave2' : 2, 'chave3' : 3}\n",
    "```\n",
    "\n",
    "Acima vemos um dicionário chamado `d`, com três pares chave-valor. A chave 'chave1' aponta para o valor 1, 'chave2' para 2 e 'chave3' aponta para o valor 3.\n",
    "\n",
    "Dicionários são ótimos para coisas do tipo agenda de telefones (pares de nomes e telefones), páginas de login (pares de endereço de e-mail com um username), etc.\n",
    "\n",
    "Para acessar um dado elemento do dicionário, você usa a notação `dicionario[chave]`. Mais exemplos abaixo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "908765\n",
      "912345\n"
     ]
    }
   ],
   "source": [
    "telefones = {\"D. Florinda\":\"912345\", \n",
    "             \"Seu Madruga\":\"908765\", \n",
    "             \"Prof. Girafales\":\"987657\", \n",
    "             \"Seu Barriga\":\"876543\"}\n",
    "\n",
    "# Mostrar o telefone do Seu Madruga:\n",
    "print(telefones[\"Seu Madruga\"])\n",
    "\n",
    "# Mostrar o telefone da D. Florinda\n",
    "print(telefones[\"D. Florinda\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Na célula abaixo, mostre o endereço do Chaves:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "enderecos = {\"Quico\":\"Casa 14\",\n",
    "             \"Chiquinha\":\"Casa 72\",\n",
    "             \"Chaves\":\"Barril de Madeira\", \n",
    "             \"Dona Clotilde\":\"Casa 71\" }\n",
    "\n",
    "# Escreva o seu código aqui"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Adicionando novos elementos a um dicionário\n",
    "Assim como listas, dicionários são mutáveis, significa que eles permitem adicionar e remover elementos depois de criados. Nós adicionamos elementos assim:\n",
    "\n",
    "```python\n",
    "dicionario[nova_chave] = novo_valor\n",
    "```\n",
    "\n",
    "Um dicionário vazio é definido com `{}`, parecido quando criamos uma lista vazia com `[]`:\n",
    "\n",
    "```python\n",
    "dicionario_vazio = {}\n",
    "```\n",
    "\n",
    "O tamanho `len()` de um dicionário é o número de pares chave-valor que ele possui. Cada par conta apenas uma vez, mesmo que o valor seja uma lista (é isso mesmo, você pode colocar até listas dentro de dicionários!).\n",
    "\n",
    "Na célula abaixo, adicione pelo menos três pares chave-valor à variável menu, com o nome do prato (como \"string\") para a chave e o preço (um número real ou inteiro) como valor. Aqui está um exemplo:\n",
    "```python\n",
    "menu['sopa'] = 10.50\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.0\n",
      "Exitem 1 itens no menu.\n",
      "{'tapioca simples': 4.0}\n"
     ]
    }
   ],
   "source": [
    "menu = {} # Dicionário vazio\n",
    "menu['tapioca simples'] = 4.00 # Adicionando um prato ao menu\n",
    "print(menu['tapioca simples'])\n",
    "\n",
    "# Escreva o seu código aqui: adicione alguns pares de prato e preço ao menu!\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "print(\"Exitem \" + str(len(menu)) + \" itens no menu.\")\n",
    "print(menu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Alterando elementos no dicionário\n",
    "\n",
    "Como os dicionários são mutáveis, eles podem ser alterados de várias maneiras. Podemos remover elementos de um dicionário com o comando del:\n",
    "```python\n",
    "del dicionario[nome_chave]\n",
    "```\n",
    "O comando acima irá remover a chave `nome_chave` e o valor associado a ela do dicionário.\n",
    "\n",
    "Um novo valor pode ser associado a uma chave existente atribuindo um valor àquela chave:\n",
    "\n",
    "```python\n",
    "dicionario[chave] = novo_valor\n",
    "```\n",
    "\n",
    "Na célula abaixo, remova os professores Ana e Ronald do dicionário usando `del`. Altere o departamento do professor Fernando pois ele não está mais na UFC Virtual. Pode ser qualquer departamento à sua escolha.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'Claudia': 'DC', 'Fernando': 'UFC Virtual', 'Ana': 'Matemática', 'Ronald': 'Estatística'}\n"
     ]
    }
   ],
   "source": [
    "# chave - professor : valor: lotação (Departamento)  \n",
    "professores = { 'Ana' : 'Matemática',\n",
    "'Yuri' : 'DLE',\n",
    "'Fernando' : 'UFC Virtual',\n",
    "'Claudia' : 'DC'\n",
    "'Ronald' : 'Estatística'}\n",
    "\n",
    "# Removendo a entrada 'Yuri'. (Ele comprou um barquinho e foi velejar no mar mediterrâneo.)\n",
    "del professores['Yuri']\n",
    "\n",
    "# Escreva o seu código aqui\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "print(professores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vejamos mais alguns exemplos com dicionários:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "987654\n"
     ]
    }
   ],
   "source": [
    "conta = {\n",
    "    \"nome_cliente\": \"Seu Madruga\",\n",
    "    \"telefones\": [\"987654\", \"234567\"],\n",
    "    \"saldo\": -2034.76,\n",
    "    \"cliente_desde\": \"01/04/2008\",\n",
    "    \"ativo\": True\n",
    "}\n",
    "print(conta[\"telefones\"][0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "No exemplo acima, nós criamos um dicionário que armazena um registro de conta bancária.<br> \n",
    "Observe que são armazenados vários tipos de valores.\n",
    "A chave \"telefones\" possui uma lista, a chave \"saldo\" possui um float (é como chamamos números reais em Python), a chave \"ativo\" possui um booleano e as demais possuem strings.<br>\n",
    "Ao final mostramos mostramos o primeiro elemento (`[0]`) da lista na chave \"telefones\" (`conta[\"telefones\"]`). Nós temos acesso direto a qualquer valor na lista, inclusive mostrar a lista inteira:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['987654', '234567']\n"
     ]
    }
   ],
   "source": [
    "conta = {\n",
    "    \"nome_cliente\": \"Seu Madruga\",\n",
    "    \"telefones\": [\"987654\", \"234567\"],\n",
    "    \"saldo\": -2034.76,\n",
    "    \"cliente_desde\": \"01/04/2008\",\n",
    "    \"ativo\": True\n",
    "}\n",
    "print(conta[\"telefones\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Agora vamos exercitar um pouco de tudo o que aprendemos sobre dicionários e listas até aqui.<br>\n",
    "Na célula abaixo, faça as seguintes operações no dicionário `conta`:\n",
    "* Adicione uma nova chave chamada \"e-mails\" e a ela atribua uma lista de strings: \"madruguinha@email.com\" e \"eu_sou_o_cara@madruga.com\";\n",
    "\n",
    "* Ordene os valores da lista usando `.sort()`;\n",
    "* Subtraia 100.00 do saldo da conta;\n",
    "* Mostre o dicionário."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "conta = {\n",
    "    \"nome_cliente\": \"Seu Madruga\",\n",
    "    \"telefones\": [\"987654\", \"234567\"],\n",
    "    \"saldo\": -2034.76,\n",
    "    \"cliente_desde\": \"01/04/2008\",\n",
    "    \"ativo\": True\n",
    "}\n",
    "\n",
    "# Adicionando uma chave \"enderecos\" e atribuindo uma lista de strings\n",
    "conta[\"enderecos\"] = ['Casa 72', 'Avenida dos desempregados']\n",
    "\n",
    "# Ordenando a lista na chave \"enderecos\"\n",
    "conta[\"enderecos\"].sort() \n",
    "\n",
    "# Comece a escrever o seu código aqui\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Loops em dicionários\n",
    "\n",
    "Você já deve estar se perguntando como um loop num dicionário funcionaria.\n",
    "\n",
    "Nós pegamos a chave ou o valor?\n",
    "\n",
    "Em poucas palavras, você pega a chave e então usa a chave para obter o valor.\n",
    "\n",
    "Por exemplo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Esse dicionário possui o valor 10!\n"
     ]
    }
   ],
   "source": [
    "d = {'x': 9, 'y': 10, 'z': 20}\n",
    "for chave in d:\n",
    "    if d[chave] == 10:\n",
    "        print (\"Esse dicionário possui o valor 10!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Eis o que fizemos no exemplo acima:\n",
    "1. Primeiro, nós criamos um dicionário `d` com strings como chaves e números como valores.\n",
    "2. Depois, nós percorremos o dicionário, armazenando uma chave em `chave` por vez.\n",
    "3. Então para cada chave, nós verificamos se o valor da chave é igual a 10.\n",
    "4. Se sim, então nós mostramos a string \"Esse dicionário possui o valor 10!\".\n",
    "\n",
    "Agora é a sua vez de tentar. Na linha 5 da célula abaixo, mostre a chave e o valor associado a ela."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "d = {'a': 'abacaxi', 'b': 'banana', 'c': 'cereja'}\n",
    "\n",
    "for chave in d:\n",
    "  # Your code here!\n",
    "  "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}