Dicionários são uma das estruturas de dados mais poderosas e versáteis do Python. Eles permitem armazenar informações em pares de chave-valor, tornando a organização e recuperação de dados extremamente eficiente. Neste guia completo, você vai aprender tudo sobre dicionários, desde o básico até técnicas avançadas.
🎯 O Que São Dicionários?
Um dicionário em Python é uma coleção não ordenada (a partir do Python 3.7, mantém a ordem de inserção) de pares chave-valor. Cada chave é única e mapeia para um valor específico, funcionando como um índice personalizado.
Pense em um dicionário como um verdadeiro dicionário de palavras: você procura uma palavra (chave) e encontra sua definição (valor). Essa estrutura é incrivelmente útil para representar dados do mundo real.
📝 Criando Dicionários
Existem várias formas de criar dicionários em Python:
# Dicionário vazio
pessoa = {}
# Dicionário com dados
usuario = {
"nome": "Ana Silva",
"idade": 28,
"cidade": "São Paulo",
"profissao": "Desenvolvedora Python"
}
# Usando o construtor dict()
produto = dict(nome="Notebook", preco=2500.00, estoque=15)
# Dicionário com tipos variados de valores
dados = {
"texto": "Python",
"numero": 42,
"lista": [1, 2, 3],
"booleano": True,
"outro_dict": {"chave": "valor"}
}
print(usuario["nome"]) # Ana Silva
print(produto["preco"]) # 2500.0
🔍 Acessando Valores
Existem duas maneiras principais de acessar valores em um dicionário:
livro = {
"titulo": "Python para Iniciantes",
"autor": "João Santos",
"ano": 2025,
"paginas": 350
}
# Método 1: Usando colchetes
titulo = livro["titulo"]
print(titulo) # Python para Iniciantes
# Método 2: Usando get() - mais seguro
autor = livro.get("autor")
print(autor) # João Santos
# Diferença importante: get() não gera erro se a chave não existir
editora = livro.get("editora", "Não informado")
print(editora) # Não informado
# Já os colchetes geram KeyError se a chave não existir
# isbn = livro["isbn"] # KeyError: 'isbn'
Por Que Usar get()?
O método get() é mais seguro porque permite definir um valor padrão caso a chave não exista, evitando erros que podem quebrar seu programa. Isso é especialmente útil quando você está trabalhando com dados externos ou APIs.
➕ Adicionando e Modificando Valores
Dicionários são mutáveis, o que significa que você pode adicionar, modificar e remover pares chave-valor após a criação:
aluno = {
"nome": "Carlos",
"curso": "Ciência da Computação"
}
# Adicionar nova chave
aluno["matricula"] = "2025001"
aluno["nota"] = 9.5
# Modificar valor existente
aluno["curso"] = "Engenharia de Software"
# Adicionar múltiplos pares com update()
aluno.update({
"semestre": 3,
"ativo": True,
"email": "[email protected]"
})
print(aluno)
# {
# 'nome': 'Carlos',
# 'curso': 'Engenharia de Software',
# 'matricula': '2025001',
# 'nota': 9.5,
# 'semestre': 3,
# 'ativo': True,
# 'email': '[email protected]'
# }
➖ Removendo Elementos
Python oferece várias maneiras de remover elementos de um dicionário:
carro = {
"marca": "Toyota",
"modelo": "Corolla",
"ano": 2024,
"cor": "Prata",
"km": 0
}
# Método 1: del - remove chave específica
del carro["cor"]
# Método 2: pop() - remove e retorna o valor
quilometragem = carro.pop("km")
print(f"Removido: {quilometragem} km") # Removido: 0 km
# Método 3: pop() com valor padrão
acessorios = carro.pop("acessorios", [])
print(acessorios) # []
# Método 4: popitem() - remove e retorna último par inserido
ultimo_item = carro.popitem()
print(ultimo_item) # ('modelo', 'Corolla')
# Método 5: clear() - remove todos os elementos
carro.clear()
print(carro) # {}
🔄 Iterando sobre Dicionários
Existem diversas formas de percorrer um dicionário, cada uma com seu propósito específico:
notas = {
"matemática": 8.5,
"português": 9.0,
"história": 7.5,
"física": 8.0
}
# Iterar sobre chaves
print("Disciplinas:")
for disciplina in notas.keys():
print(f"- {disciplina}")
# Iterar sobre valores
print("\nNotas:")
for nota in notas.values():
print(f"- {nota}")
# Iterar sobre chaves e valores (mais comum)
print("\nBoletim:")
for disciplina, nota in notas.items():
situacao = "Aprovado ✅" if nota >= 7 else "Reprovado ❌"
print(f"{disciplina}: {nota} - {situacao}")
# OUTPUT:
# Matemática: 8.5 - Aprovado ✅
# Português: 9.0 - Aprovado ✅
# História: 7.5 - Aprovado ✅
# Física: 8.0 - Aprovado ✅
🔑 Verificando Existência de Chaves
Antes de acessar uma chave, é sempre bom verificar se ela existe:
config = {
"tema": "escuro",
"idioma": "pt-BR",
"notificacoes": True
}
# Verificar com 'in'
if "tema" in config:
print(f"Tema atual: {config['tema']}") # Tema atual: escuro
if "volume" not in config:
config["volume"] = 80 # Define valor padrão
# Alternativa: usar get() com valor padrão
volume = config.get("volume", 50)
brilho = config.get("brilho", 100)
print(f"Volume: {volume}") # Volume: 80
print(f"Brilho: {brilho}") # Brilho: 100
📊 Métodos Úteis de Dicionários
Python fornece diversos métodos nativos para trabalhar com dicionários de forma eficiente:
estoque = {
"notebook": 25,
"mouse": 150,
"teclado": 80,
"monitor": 35
}
# keys() - retorna todas as chaves
produtos = list(estoque.keys())
print(f"Produtos disponíveis: {produtos}")
# values() - retorna todos os valores
quantidades = list(estoque.values())
total_itens = sum(quantidades)
print(f"Total de itens em estoque: {total_itens}")
# items() - retorna pares chave-valor
for produto, quantidade in estoque.items():
if quantidade < 50:
print(f"⚠️ Estoque baixo: {produto} ({quantidade} unidades)")
# copy() - cria uma cópia superficial
backup_estoque = estoque.copy()
# fromkeys() - cria dicionário com chaves e valor padrão
categorias = ["eletrônicos", "roupas", "livros"]
estoque_categorias = dict.fromkeys(categorias, 0)
print(estoque_categorias)
# {'eletrônicos': 0, 'roupas': 0, 'livros': 0}
# setdefault() - retorna valor ou define se não existir
estoque.setdefault("webcam", 20)
print(estoque["webcam"]) # 20
🎨 Dictionary Comprehension
Assim como list comprehension (que vimos no nosso guia de listas), também podemos criar dicionários de forma concisa:
# Criar dicionário de quadrados
quadrados = {num: num**2 for num in range(1, 6)}
print(quadrados) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# Filtrar dicionário
numeros = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
pares = {k: v for k, v in numeros.items() if v % 2 == 0}
print(pares) # {'b': 2, 'd': 4}
# Inverter chaves e valores
original = {"nome": "Ana", "cidade": "SP", "idade": "28"}
invertido = {v: k for k, v in original.items()}
print(invertido) # {'Ana': 'nome', 'SP': 'cidade', '28': 'idade'}
# Transformar lista em dicionário
frutas = ["maçã", "banana", "laranja"]
precos = [3.50, 2.00, 4.00]
tabela_precos = {fruta: preco for fruta, preco in zip(frutas, precos)}
print(tabela_precos)
# {'maçã': 3.5, 'banana': 2.0, 'laranja': 4.0}
# Contagem de caracteres
texto = "python"
contagem = {char: texto.count(char) for char in texto}
print(contagem) # {'p': 1, 'y': 1, 't': 1, 'h': 1, 'o': 1, 'n': 1}
🔁 Dicionários Aninhados
Dicionários podem conter outros dicionários, criando estruturas de dados complexas perfeitas para representar informações hierárquicas:
empresa = {
"nome": "TechCorp",
"fundacao": 2020,
"funcionarios": {
"dev001": {
"nome": "Ana Silva",
"cargo": "Desenvolvedora Senior",
"salario": 12000,
"tech_stack": ["Python", "Django", "PostgreSQL"]
},
"dev002": {
"nome": "Bruno Costa",
"cargo": "DevOps Engineer",
"salario": 11000,
"tech_stack": ["Docker", "Kubernetes", "AWS"]
},
"dev003": {
"nome": "Carla Santos",
"cargo": "Data Scientist",
"salario": 13000,
"tech_stack": ["Python", "Pandas", "TensorFlow"]
}
},
"departamentos": {
"desenvolvimento": ["dev001", "dev002"],
"dados": ["dev003"]
}
}
# Acessar dados aninhados
print(empresa["funcionarios"]["dev001"]["nome"]) # Ana Silva
# Iterar sobre funcionários
print("\n👥 Equipe:")
for id_func, dados in empresa["funcionarios"].items():
print(f"\n{id_func}:")
print(f" Nome: {dados['nome']}")
print(f" Cargo: {dados['cargo']}")
print(f" Tecnologias: {', '.join(dados['tech_stack'])}")
# Calcular folha de pagamento
total_salarios = sum(
func["salario"]
for func in empresa["funcionarios"].values()
)
print(f"\n💰 Folha de pagamento total: R$ {total_salarios:,.2f}")
# 💰 Folha de pagamento total: R$ 36,000.00
🎯 Projeto Prático: Sistema de Cadastro de Alunos
Vamos criar um sistema completo de gerenciamento de alunos usando dicionários:
class SistemaEscolar:
def __init__(self):
self.alunos = {}
self.proximo_id = 1
def cadastrar_aluno(self, nome, idade, curso):
"""Cadastra um novo aluno no sistema"""
id_aluno = f"ALU{self.proximo_id:04d}"
self.alunos[id_aluno] = {
"nome": nome,
"idade": idade,
"curso": curso,
"notas": {},
"ativo": True
}
self.proximo_id += 1
print(f"✅ Aluno cadastrado: {nome} (ID: {id_aluno})")
return id_aluno
def adicionar_nota(self, id_aluno, disciplina, nota):
"""Adiciona nota de uma disciplina"""
if id_aluno in self.alunos:
self.alunos[id_aluno]["notas"][disciplina] = nota
print(f"✅ Nota adicionada: {disciplina} = {nota}")
else:
print(f"❌ Aluno {id_aluno} não encontrado")
def calcular_media(self, id_aluno):
"""Calcula média geral do aluno"""
if id_aluno not in self.alunos:
return None
notas = self.alunos[id_aluno]["notas"].values()
if not notas:
return 0
return sum(notas) / len(notas)
def exibir_boletim(self, id_aluno):
"""Exibe boletim completo do aluno"""
if id_aluno not in self.alunos:
print(f"❌ Aluno {id_aluno} não encontrado")
return
aluno = self.alunos[id_aluno]
print(f"\n{'='*50}")
print(f"📋 BOLETIM - {aluno['nome']}")
print(f"{'='*50}")
print(f"ID: {id_aluno}")
print(f"Curso: {aluno['curso']}")
print(f"Idade: {aluno['idade']} anos")
print(f"\n📚 Notas:")
if aluno['notas']:
for disciplina, nota in aluno['notas'].items():
status = "✅" if nota >= 7 else "❌"
print(f" {disciplina}: {nota} {status}")
media = self.calcular_media(id_aluno)
print(f"\n📊 Média Geral: {media:.2f}")
if media >= 7:
print("🎉 Situação: APROVADO")
else:
print("⚠️ Situação: REPROVADO")
else:
print(" Nenhuma nota cadastrada")
print(f"{'='*50}\n")
def listar_alunos(self):
"""Lista todos os alunos cadastrados"""
if not self.alunos:
print("Nenhum aluno cadastrado")
return
print(f"\n{'='*50}")
print("👥 ALUNOS CADASTRADOS")
print(f"{'='*50}")
for id_aluno, dados in self.alunos.items():
status = "🟢 Ativo" if dados["ativo"] else "🔴 Inativo"
media = self.calcular_media(id_aluno)
print(f"{id_aluno} - {dados['nome']}")
print(f" Curso: {dados['curso']} | Média: {media:.1f} | {status}")
print(f"{'='*50}\n")
# Testando o sistema
sistema = SistemaEscolar()
# Cadastrar alunos
id1 = sistema.cadastrar_aluno("Ana Silva", 20, "Ciência da Computação")
id2 = sistema.cadastrar_aluno("Bruno Costa", 22, "Engenharia de Software")
# Adicionar notas
sistema.adicionar_nota(id1, "Python", 9.5)
sistema.adicionar_nota(id1, "Banco de Dados", 8.5)
sistema.adicionar_nota(id1, "Algoritmos", 9.0)
sistema.adicionar_nota(id2, "Python", 7.0)
sistema.adicionar_nota(id2, "DevOps", 8.0)
# Exibir informações
sistema.listar_alunos()
sistema.exibir_boletim(id1)
💡 Dicionários vs Listas: Quando Usar Cada Um?
É importante entender quando usar dicionários e quando usar listas:
Use Dicionários quando:
- Você precisa acessar elementos por uma chave personalizada (nome, ID, etc.)
- A ordem dos elementos não é crucial (embora seja mantida desde Python 3.7)
- Você precisa verificar rapidamente se uma chave existe
- Está trabalhando com dados estruturados em formato chave-valor
- Precisa de acesso rápido O(1) aos elementos
Use Listas quando:
- A ordem dos elementos é importante
- Você acessa elementos por posição numérica
- Permite valores duplicados
- Precisa realizar operações de ordenação frequentemente
🔗 Dicionários e JSON
Dicionários Python são perfeitamente compatíveis com JSON, o formato de dados mais usado na web:
import json
# Dicionário Python
usuario = {
"nome": "João Silva",
"email": "[email protected]",
"idade": 30,
"ativo": True,
"interesses": ["Python", "Data Science", "IA"]
}
# Converter para JSON (string)
json_string = json.dumps(usuario, indent=2, ensure_ascii=False)
print(json_string)
# Salvar em arquivo
with open("usuario.json", "w", encoding="utf-8") as arquivo:
json.dump(usuario, arquivo, indent=2, ensure_ascii=False)
# Ler de arquivo
with open("usuario.json", "r", encoding="utf-8") as arquivo:
dados = json.load(arquivo)
print(f"Nome: {dados['nome']}")
# Converter JSON string para dicionário
json_texto = '{"linguagem": "Python", "nivel": "Avançado"}'
dicionario = json.loads(json_texto)
print(dicionario) # {'linguagem': 'Python', 'nivel': 'Avançado'}
⚡ Performance: Dicionários São Rápidos!
Dicionários em Python usam hash tables internamente, o que os torna extremamente eficientes. A busca, inserção e remoção de elementos tem complexidade O(1) em média, ou seja, praticamente instantânea mesmo com milhares de elementos.
import time
# Criar dicionário grande
grande_dict = {i: f"valor_{i}" for i in range(1000000)}
# Busca em dicionário (muito rápido)
inicio = time.time()
valor = grande_dict.get(999999)
fim = time.time()
print(f"Busca em dicionário: {(fim - inicio) * 1000:.6f}ms")
# Comparar com lista (mais lento)
grande_lista = [(i, f"valor_{i}") for i in range(1000000)]
inicio = time.time()
for item in grande_lista:
if item[0] == 999999:
valor = item[1]
break
fim = time.time()
print(f"Busca em lista: {(fim - inicio) * 1000:.6f}ms")
📚 Boas Práticas com Dicionários
- Use chaves descritivas: Prefira
"nome_completo"a"nc" - Prefira get() ao acesso direto: Evita KeyError inesperados
- Use valores padrão:
dict.get(chave, valor_padrao) - Documente estruturas complexas: Dicionários aninhados podem ficar confusos
- Valide dados: Especialmente ao receber de fontes externas
- Use type hints: Em Python 3.5+, ajuda na manutenção do código
from typing import Dict, List, Any
def processar_usuario(dados: Dict[str, Any]) -> Dict[str, str]:
"""
Processa dados de usuário e retorna informações formatadas.
Args:
dados: Dicionário com informações do usuário
Returns:
Dicionário com dados processados
"""
return {
"nome_formatado": dados.get("nome", "").title(),
"email_validado": dados.get("email", "").lower(),
"status": "ativo" if dados.get("ativo", False) else "inativo"
}
🎓 Recursos Adicionais
Para aprofundar ainda mais seus conhecimentos sobre dicionários, recomendo consultar a documentação oficial do Python sobre dicionários, que contém informações detalhadas sobre implementação e otimizações.
🚀 Próximos Passos
Agora que você domina dicionários em Python, está pronto para explorar conceitos mais avançados:
- Collections module (defaultdict, Counter, OrderedDict)
- Manipulação de dados com Pandas
- APIs REST e JSON
- Bancos de dados NoSQL (MongoDB, Redis)
Quer se tornar um expert em Python e estruturas de dados? Confira nosso curso completo de Python do zero ao avançado com projetos práticos, exercícios interativos e certificado reconhecido pelo mercado!
📝 Resumo
Neste guia completo, você aprendeu:
- ✅ O que são dicionários e como criá-los
- ✅ Como acessar, adicionar e remover elementos
- ✅ Métodos essenciais: get(), keys(), values(), items()
- ✅ Dictionary comprehension para código conciso
- ✅ Dicionários aninhados para estruturas complexas
- ✅ Integração com JSON para APIs e arquivos
- ✅ Boas práticas e otimizações de performance
- ✅ Projeto prático: Sistema de cadastro de alunos
Dicionários são fundamentais em Python e aparecem em praticamente todos os projetos reais. Dominar essa estrutura de dados é essencial para se tornar um desenvolvedor Python profissional. Continue praticando e explorando as infinitas possibilidades desta ferramenta poderosa!