• Python
  • 08. Armazenamento de chaves e valores em dicionários
  • Introdução

08. Dicionários#

O objetivo de aprendizado deste handout é que, ao final da atividade, você seja capaz de utilizar dicionários em seus programas em conjunto com as estruturas que vimos nas aulas anteriores (input, if, while, for, list, etc.). Vamos começar com um aquecimento.

Exemplo com listas#

Exercise 1

Considere o código a seguir:

lista = [
    ["Fulano", "99999-1111"],
    ["Sicrano", "99999-2222"],
    ["Beltrano", "99999-3333"]
]
Qual das alternativas a seguir parece descrever o conteúdo desta lista?

Answer

Os valores armazenados na lista do código acima, representam dados de contatos telefônicos.

A lista é composta de outras lista de tamanho 2. E podemos perceber que o primeiro valor destas listas menores, armazena o nome do contato e o segundo valor armazena o número do telefone.

Exercise 2

Considere ainda a lista de contatos telefônicos:

lista = [
    ["Fulano", "99999-1111"],
    ["Sicrano", "99999-2222"],
    ["Beltrano", "99999-3333"]
]
Qual das alternativas a seguir, possui o código que imprime somente os nomes da lista de contatos telefônico?

Answer

for nome_e_telefone in lista:
    nome = nome_e_telefone[0]
    print(nome)
O código acima, percorre a lista de contatos telefônicos. A cada iteração do comando for a variável nome_e_telefone representará a lista ['NOME','NÚMERO DE TELEFONE']. Desta forma, o código nome_e_telefone[0] representa o valor de interesse que é o nome do contato.

Exercise 3

Considere o código abaixo:

lista = [
    ["Fulano", "99999-1111"],
    ["Sicrano", "99999-2222"],
    ["Beltrano", "99999-3333"]
]

nome_selecionado = input("Digite um nome: ")

for nome_e_telefone in lista:
    nome = nome_e_telefone[0]
    if nome == nome_selecionado:
        telefone = nome_e_telefone[1]
        print("Telefone de {0} é: {1}".format(nome, telefone))
O que é impresso no terminal, ao testar o código acima, e digitar Sicrano no terminal quando a mensagem "Digite um nome: " aparecer?

Answer

O código acima funciona como um agenda telefônica, onde o usuário informa um nome e o programa imprime as informações deste contato.

Agenda Telefônica ☎ 📖#

Vamos entender melhor o que o código abaixo funciona faz:

lista = [
    ["Fulano", "99999-1111"],
    ["Sicrano", "99999-2222"],
    ["Beltrano", "99999-3333"]
]

nome_selecionado = input("Digite um nome: ")

for nome_e_telefone in lista:
    nome = nome_e_telefone[0]
    if nome == nome_selecionado:
        telefone = nome_e_telefone[1]
        print("Telefone de {0} é: {1}".format(nome, telefone))
  1. Começamos o código criando uma lista na qual cada elemento é uma outra lista contendo dois elementos. O primeiro desses elementos é sempre um nome e o segundo é sempre o seu respectivo telefone;
  2. O usuário digita um nome;
  3. Para cada elemento nome_e_telefone da lista repetimos o bloco a seguir (note que a variável nome_e_telefone sempre vai guardar uma lista com exatamente dois elementos, o nome e o telefone):
  4. Armazenamos o primeiro elemento (o nome) de nome_e_telefone em uma variável nome;
  5. Se o nome for igual ao nome digitado pelo usuário executamos o bloco a seguir:
    1. Armazenamos o segundo elemento (o telefone) de nome_e_telefone em uma variável telefone;
    2. Imprimimos o telefone da pessoa selecionada

Importante

Mesmo depois de imprimir o telefone da pessoa selecionada, o código continua percorrendo os próximos elementos da lista até o fim.

Acabamos de implementar uma lista de contatos!

No código acima, não seria mais fácil se eu pudesse acessar elementos de uma lista utilizando palavras ao invés de números (índices)? Assim eu poderia acessar, por exemplo, o telefone de "Fulano" com o código lista["Fulano"] ao invés de ter que procurar por todos os elementos da lista. Para isso temos os dicionários!

Dicionários#

Um dicionário pode armazenar uma quantidade arbitrária de elementos, assim como uma lista. A diferença é que não estamos limitados a utilizar números como os índices, em dicionários podemos indexar os elementos por quase qualquer coisa (floats, strings, etc.)! No exemplo da lista de contatos, poderíamos ter ao invés de uma lista de nomes e telefones indexados por números, uma lista de telefones indexada por nomes:

Equivalência de uma lista para um dicionário.

O problema disso é que na lista a posição de cada elemento está claramente associada a um número: o primeiro elemento da lista é o 0, o segundo é o 1, o terceiro é o 2 e assim por diante. No dicionário essa associação entre o índice (no exemplo, o nome) e a localização de um valor (o telefone) não é igualmente clara. Independente da ordem dos elementos no dicionário queremos utilizar os nomes para acessar os telefones. Por isso, ao criar um dicionário precisamos ser explícitos sobre qual é o "índice" de cada valor adicionado. Fazemos isso utilizando o seguinte código (ainda utilizando o exemplo acima):

dicionario = {"Fulano": "99999-1111", "Sicrano": "99999-2222", "Beltrano": "99999-3333"}

A princípio pode parecer um pouco assustador, mas não se preocupe, com um pouco de prática você vai se acostumar. Vamos entender o que a linha acima está fazendo. Assim como definimos listas utilizando os colchetes [], os dicionários são definidos com chaves {}. Então definimos os pares de "índice" e valor do elemento separados por dois pontos (":").

Exercise 4

Qual dos símbolos abaixo devemos utilizar para definir um dicionário?

Answer

Utilizamos as chaves {} para definir um dicionário em Python.

Chaves e valores#

Talvez você tenha reparado que utilizamos aspas quando nos referíamos aos "índices" do dicionário. Na verdade, no dicionário chamamos os índices de chaves (em inglês: "keys") e os elementos armazenados de valores (em inglês: "values"). Vimos também que as chaves e valores estão associados. Esse par chave-valor é chamado de item (em inglês... também é "item"). Por exemplo, em:

idades = {'Sicrano': 18, 'Beltrano': 20}

As chaves são 'Sicrano' e 'Beltrano', os valores são 18 e 20 e os itens são ('Sicrano', 18) e ('Beltrano', 20).

Exercise 5

Considere o código a seguir:

dicionario = {
  "Fulano": "99999-1111",
  "Sicrano": "99999-2222",
  "Beltrano": "99999-3333"
}
Qual das alternativas a seguir, representam as chaves do dicionário do código acima?

Answer

As chaves são os valores "Fulano", "Sicrano" e "Beltrano" que estão a esquerda dos dois-pontos :.

Exercise 6

Considere o código a seguir:

dicionario = {
  "Fulano": "99999-1111",
  "Sicrano": "99999-2222",
  "Beltrano": "99999-3333"
}
Qual das alternativas a seguir, representam os valores do dicionário do código acima?

Answer

Os valores do dicionário são "99999-1111", "99999-2222" e "99999-3333" que estão a direita dos dois-pontos :.

Exercise 7

Considere o código a seguir:

dicionario = {
  "Fulano": "99999-1111",
  "Sicrano": "99999-2222",
  "Beltrano": "99999-3333"
}
Qual das alternativas a seguir, representam os itens do dicionário do código acima?

Answer

Os itens são os pares de valores "Fulano": "99999-1111", "Sicrano": "99999-2222" e "Beltrano": "99999-3333".

Acessando valores em um dicionário#

Vimos que podemos criar um dicionário colocando os pares de chaves e valores entre { e }. Para acessa um valor em uma determinada chave utilizamos o mesmo formato utilizado em listas. No nosso exemplo, dicionario['Sicrano'] devolve o valor armazenado na chave 'Sicrano', ou seja, '99999-2222'.

Exercise 8

Considere o código disponibilizado no começo do handout:

lista = [
    ["Fulano", "99999-1111"],
    ["Sicrano", "99999-2222"],
    ["Beltrano", "99999-3333"]
]

nome_selecionado = input("Digite um nome: ")

for nome_e_telefone in lista:
    nome = nome_e_telefone[0]
    if nome == nome_selecionado:
        telefone = nome_e_telefone[1]
        print("Telefone de {0} é: {1}".format(nome, telefone))
Reescreva o código da lista de contatos para utilizar dicionários. Dica: o for não será mais necessário. É possível substituí-lo por uma única linha.

Exercise 9

Qual das opções a seguir é uma possível solução para o exercício anterior.

Answer

contato_telefonico = {
  "Fulano": "99999-1111",
  "Sicrano": "99999-2222",
  "Beltrano": "99999-3333"
}

nome_selecionado = input("Digite um nome: ")
telefone = contato_telefonico[nome_selecionado]

print("Telefone de {0} é: {1}".format(nome_selecionado, telefone))
O código acima é uma possível solução para o exercício anterior. Ao utiliza o dicionário, não precisamos mais do comando for, pois basta utilizar o código contato_telefonico[nome_selecionado] para acessar as informações do contato desejado.

Você conseguiu identificar o problema das outras alternativas?

Exercise 10

Faça o exercício Preço do livro.

Acessar exercício

Exercise 11

Faça o exercício Software de tradução.

Acessar exercício

Inicialização de dicionários#

Vamos ver a inicialização de dicionários. 👉 Clique aqui