Dicionários em Python
Antonio Carlos Marcelino de Paula <[email protected]>
Rodrigo Rocha <
[email protected]>
Dicionários
● Dicionários são coleções de itens que são acessados não por um índice,
mas por uma chave, que pode ser de qualquer tipo (por exemplo, string)
● Cada elemento é uma combinação de chave e valor.
○ Uma chave que vai servir para indexar (posicionar) determinado elemento no dicionário.
○ Um valor que aceita diversos tipos: listas, outros dicionários, inteiros, strings e etc.
● Sua sintaxe básica é: {'chave': 'valor'}.
● Utiliza-se {} para delimitar o dicionário; a chave é separada do valor por
dois pontos :.
● Nesta aula, vamos aprender a criar nossos próprios dicionários.
Criação de um dicionário
Considere um dicionário contendo notas de alunos
● Observe o exemplo abaixo:
Os valores são: 8, 7 e 10
notas = {'joao': 8, 'maria': 7, 'jose': 10}
As chaves são: ‘joao’, 'maria' e 'jose'.
Funcionamento de um dicionário
É possível imprimir o conteúdo de um dicionário
● Observe o exemplo abaixo:
notas = {'joao': 8, Cria o dicionário
'maria': 7,
'jose': 10 }
Imprime o conteúdo
print(notas)
do dicionário.
>>> {'joao': 8, 'maria': 7, 'jose': 10}
Resultado após execução.
Acessando os elementos de um dicionário
● Um dicionário é acessado por suas chaves.
● Diferentemente de listas, onde o índice é um número, dicionários utilizam
suas chaves como índice.
Cria o dicionário
● Observe o exemplo abaixo:
notas = {'joao': 8, 'maria': 7, 'jose': 10} Imprime as notas de
print("Nota de João: ", notas['joao']) joao, maria e jose.
print("Nota de Maria: ", notas['maria'])
print("Nota de José: ", notas['jose'])
>>> Nota de João: 8
>>> Nota de Maria: 7
Resultado após execução.
>>> Nota de José: 10
Acessando a uma chave inexistente
● Se a chave não existir, uma exceção do tipo KeyError será exibida.
● Observe o exemplo abaixo:
notas = {'joao': 8, 'maria': 7, 'jose': 10}
print("Nota de Luis: ", notas['luis'])
A chave luis não
existe no dicionário.
>>> Traceback (most recent call last):
>>> File "main.py", line 5, in <module>
>>> print("Nota de Luis: ", notas['luis'])
>>> KeyError: 'luis'
Resultado após execução.
Verificando se a chave existe no dicionário
● É possível também verificar se a chave existe antes de acessá-la.
● Para verificar se uma chave pertence ao dicionário, podemos usar o
operador in
● Observe o exemplo abaixo:
notas = {'joao': 8, 'maria': 7, 'jose': 10}
print('luis' in notas) A chave luis não existe no dicionário.
>>> False
print('joao' in notas) A chave joao existe no dicionário.
>>> True
Obtendo uma lista de chaves e valores
● Podemos obter uma lista com as chaves ou com os valores do dicionário.
● Observe o exemplo abaixo:
notas = {'joao': 8, 'maria': 7, 'jose': 10}
print(notas.keys()) Imprime as chaves do dicionário
>>> dict_keys(['joao', 'maria', 'jose'])
print(notas.values()) Imprime os valores do dicionário
>>> dict_values([8, 7, 10])
Observe que os métodos keys() e values()
retornam geradores. Você pode utilizá-los
diretamente dentro de um for ou transformá-los
em lista usando a função list.
Considere agora que precisa consultar a nota de um aluno
notas = {'joao': 8, 'maria': 7, 'jose': 10}
while True:
nome = input("Digite o nome do aluno ou fim para terminar: ")
if nome == "fim":
break
if nome in notas: Verifica se a nota do aluno existe no dicionário
print("Nota %2.2f" % notas[nome])
else:
print("Nota não encontrada!")
Se o dicionário contém a
chave procurada será
Exemplo de entrada/saída:
exibida a nota associada
>>> Digite o nome do aluno ou fim para terminar: joao
à chave; caso contrário,
>>> Nota 8.00
será exibida uma
>>> Digite o nome do aluno ou fim para terminar: luis
mensagem de erro.
>>> Nota não encontrada!
>>> Digite o nome do aluno ou fim para terminar: fim
Exclusão de uma associação do dicionário
● Para apagar uma chave, devemos utilizar a instrução del .
● Observe o exemplo abaixo:
notas = {'joao': 8, 'maria': 7, 'jose': 10}
del notas['maria'] Apaga a nota de maria
print(notas)
>>> {'joao': 8, 'jose': 10}
Observe que a nota de maria
foi excluída do dicionário.
Dicionários com listas
Criando um dicionário com lista
● Em Python, podemos ter dicionários nos quais as chaves são associadas a
listas ou mesmo a outros dicionários.
● Imagine uma relação de estoque de mercadorias onde teríamos, além do
preço, a quantidade em estoque.
● Observe o exemplo abaixo: Nesse caso, o nome do produto
é a chave, e a lista consiste nos
estoque = { valores associados, uma lista
por chave. O primeiro elemento
'cerveja': [350, 12.50], da lista é a quantidade
'agua': [125, 4.00], disponível; e o segundo, o preço
'refrigerante': [235, 6.30] do produto.
}
Utilizando um dicionário com lista
● Considere uma aplicação que recebe a quantidade vendida de um produto,
atualiza a quantidade em uma relação de estoque de mercadorias e exibe o
valor total da venda.
estoque = {'cerveja': [350, 12.50], 'agua': [125, 4.00], 'refrigerante': [235, 6.30]}
prod_vendido = input("Digite o produto vendido:")
qtd_vendida = int(input("Digite a quantidade vendida:")) Atualiza o estoque no
estoque[prod_vendido][0] -= qtd_vendida dicionário.
total_venda = estoque[prod_vendido][1] * qtd_vendida Calcula o total da venda
print(" O total da venda foi: %21.2f\n" % total_venda) obtendo o preço do
print(estoque) produto no dicionário.
>>> Digite o produto vendida:agua
>>> Digite a quantidade vendida:30 Observe que ao final da execução do código o
>>> O total da venda foi: 120.00 estoque foi atualizado 125 para 95.
>>> {'cerveja': [350, 12.5], 'agua': [95, 4.0], 'refrigerante': [235, 6.3]}
Sobre o uso de dicionários
● Usar um dicionário é mais vantajoso do que usar uma lista quando seus
dados são facilmente acessados por suas chaves.
● O dicionário permite acessar os valores associados a uma chave
rapidamente sem pesquisar.
● A implementação interna de dicionários também garante uma boa
velocidade de acesso quando temos muitas chaves.
Porém, um dicionário não organiza suas chaves, ou seja, as primeiras chaves
inseridas nem sempre serão as primeiras na lista de chaves. Se seus dados
precisam preservar a ordem de inserção (como em filas ou pilhas, continue a
usar listas), dicionários não serão uma opção.
Outros exemplos
Lista de dicionários (exemplo: temperaturas)
Considere uma estação leituras = [
meteorológica que faz uma {"dia": "segunda", "temperatura": 28.1},
leitura por dia de seus {"dia": "terça", "temperatura": 32.5},
sensores. {"dia": "quarta", "temperatura": 29.8},
{"dia": "quinta", "temperatura": 33.2},
Dada uma lista de leituras {"dia": "sexta", "temperatura": 30.6},
(cada uma com dia e ]
temperatura), imprima os # Imprimir dias que tiveram temperatura superior a 30 graus
dias que tiveram temperatura for l in leituras:
maior que 30 ºC.
if l["temperatura"] > 30.0:
print(l["dia"])
Dicionário de listas (exemplo: palavras classificadas por tamanho)
dicionario = {}
Dada uma lista de palavras, crie um
dicionário em que cada item seja assim:
palavras = input().split()
{n: lista de palavras com tamanho n} for palavra in palavras:
n = len(palavra)
Então imprima, para cada n, a lista de
if n not in dicionario:
palavras com o tamanho n
dicionario[n] = []
dicionario[n].append(palavra)
Entrada Saída
casa cama aba asa 3 : aba, asa, uva for n in sorted(dicionario.keys()):
uva coisa 4 : casa, cama print(n, ":", ", ".join(dicionario[n]))
(na mesma linha) 5 : coisa
Dicionário de dicionários (exemplo: SenhaBot)
● Professores possuem uma lista de alunos matriculados, com número de
matrícula, nome, senha no JUDE e login no Discord
● Inicialmente, os professores não sabem o login dos alunos
● Os alunos, para descobrir sua senha no JUDE, enviam seu número de
matrícula para o SenhaBot, um bot do Discord
● O SenhaBot pega o login do aluno no Discord e a matrícula e faz o seguinte:
● Se o número de matrícula não está na lista dos professores, dá erro
● Se o número de matrícula existe e está associado ao login do aluno, envia a senha
● Se o número de matrícula existe e está associado a outro login, dá erro
● Se o número de matrícula existe e não está associado a nenhum login, associa ao
login do aluno e envia a senha
login, matricula = input().split()
usuarios = {
SenhaBot '200310593': {
if matricula not in usuarios:
'nome': 'João',
print('Usuário não encontrado')
'login': 'joao1999',
else:
'senha': '123',
# Se login está vazio, vincula a usuário atual
},
if usuarios[matricula]['login'] == '':
'200310594': {
usuarios[matricula]['login'] = login
'nome': 'Maria',
# Envia senha, se usuário estiver vinculado à matrícula
'login': '',
if login == usuarios[matricula]['login']:
'senha': 'qwe',
nome = usuarios[matricula]['nome']
}
senha = usuarios[matricula]['senha']
}
print('Oi,', nome)
O SenhaBot real faz mais uma análise, que não é print('Sua senha é', senha)
feita neste código: se o login já estiver vinculado a
algum número de matrícula, ele envia ao usuário a else:
matrícula e a senha vinculados ao login. print('Erro: matrícula associada a outro usuário')