Os dicionários são uma das estruturas de dados mais poderosas e versáteis do Python. Eles armazenam dados no formato chave-valor (key-value), permitindo acesso extremamente rápido (O(1)) às informações.

🎯 O Que São Dicionários?

Um dicionário é uma coleção não ordenada de pares chave-valor. Pense nele como uma agenda telefônica: você procura o nome (chave) e encontra o número (valor).

# Criando um dicionário
pessoa = {
    "nome": "Ada Lovelace",
    "idade": 36,
    "profissao": "Matemática",
    "linguagens": ["Python", "C++", "JavaScript"]
}

# Acessando valores
print(pessoa["nome"])  # Ada Lovelace
print(pessoa["idade"])  # 36

📝 Criando Dicionários

Sintaxe Básica

# Dicionário vazio
configs = {}
configs_alt = dict()

# Dicionário com dados
produto = {
    "nome": "Notebook",
    "preco": 3500.00,
    "estoque": 15,
    "disponivel": True
}

# Com dict()
usuario = dict(nome="João", email="[email protected]", idade=25)

# Dicionário a partir de tuplas
capitais = dict([("Brasil", "Brasília"), ("Portugal", "Lisboa")])

🔍 Acessando e Modificando Dados

Acesso Seguro com .get()

pessoa = {"nome": "Maria", "idade": 30}

# Forma insegura - pode gerar erro KeyError
# print(pessoa["cidade"])  # ❌ ERRO!

# Forma segura - retorna None se não existir
cidade = pessoa.get("cidade")  # None
cidade = pessoa.get("cidade", "Não informado")  # Valor padrão

print(pessoa.get("nome"))  # Maria

Adicionando e Modificando

carro = {
    "marca": "Toyota",
    "modelo": "Corolla"
}

# Adicionar nova chave
carro["ano"] = 2024
carro["cor"] = "Prata"

# Modificar valor existente
carro["marca"] = "Honda"

# Atualizar múltiplos valores
carro.update({"modelo": "Civic", "preco": 120000})

print(carro)
# {'marca': 'Honda', 'modelo': 'Civic', 'ano': 2024, 'cor': 'Prata', 'preco': 120000}

❌ Removendo Elementos

estoque = {
    "maça": 50,
    "banana": 30,
    "laranja": 45,
    "uva": 20
}

# del - remove chave específica
del estoque["uva"]

# pop() - remove e retorna o valor
quantidade = estoque.pop("banana")  # 30

# pop() com valor padrão (evita erro)
limao = estoque.pop("limao", 0)  # 0 (não existia)

# popitem() - remove e retorna último item (Python 3.7+)
ultimo = estoque.popitem()  # ('laranja', 45)

# clear() - limpa todo o dicionário
estoque.clear()  # {}

🔑 Métodos Essenciais

keys(), values() e items()

notas = {
    "Alice": 9.5,
    "Bob": 8.0,
    "Carol": 9.8,
    "David": 7.5
}

# Todas as chaves
chaves = notas.keys()
print(list(chaves))  # ['Alice', 'Bob', 'Carol', 'David']

# Todos os valores
valores = notas.values()
print(list(valores))  # [9.5, 8.0, 9.8, 7.5]

# Pares chave-valor
itens = notas.items()
print(list(itens))  # [('Alice', 9.5), ('Bob', 8.0), ...]

Verificando Existência de Chaves

dados = {"nome": "João", "idade": 25}

# Operador 'in'
if "nome" in dados:
    print("Nome existe!")

if "email" not in dados:
    print("Email não cadastrado")

# Usando .get() com valor padrão
email = dados.get("email", "[email protected]")

🔄 Iterando sobre Dicionários

precos = {
    "arroz": 25.90,
    "feijao": 8.50,
    "macarrao": 4.30
}

# Iterar sobre chaves (padrão)
for produto in precos:
    print(produto)

# Iterar sobre valores
for preco in precos.values():
    print(f"R$ {preco:.2f}")

# Iterar sobre chave e valor
for produto, preco in precos.items():
    print(f"{produto}: R$ {preco:.2f}")

# Usando .keys() explicitamente
for produto in precos.keys():
    print(produto)

💡 Dictionary Comprehension

# Criar dicionário a partir de lista
numeros = [1, 2, 3, 4, 5]
quadrados = {n: n**2 for n in numeros}
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# Com condição
pares = {n: n**2 for n in range(10) if n % 2 == 0}
# {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

# Inverter chave-valor
original = {"a": 1, "b": 2, "c": 3}
invertido = {valor: chave for chave, valor in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}

# Filtrar dicionário
notas = {"Ana": 8, "Bruno": 5, "Carlos": 9, "Diana": 6}
aprovados = {nome: nota for nome, nota in notas.items() if nota >= 7}
# {'Ana': 8, 'Carlos': 9}

🏗️ Dicionários Aninhados

empresa = {
    "TI": {
        "funcionarios": 50,
        "gerente": "Carlos Silva",
        "tecnologias": ["Python", "JavaScript", "Docker"]
    },
    "RH": {
        "funcionarios": 10,
        "gerente": "Maria Santos",
        "area": "Recursos Humanos"
    },
    "Vendas": {
        "funcionarios": 30,
        "gerente": "João Pedro",
        "meta_mensal": 500000
    }
}

# Acessar dados aninhados
print(empresa["TI"]["gerente"])  # Carlos Silva
print(empresa["TI"]["tecnologias"][0])  # Python

# Modificar dados aninhados
empresa["RH"]["funcionarios"] = 12

# Adicionar novo departamento
empresa["Marketing"] = {
    "funcionarios": 15,
    "gerente": "Ana Costa"
}

⚡ Performance e Complexidade

Os dicionários em Python utilizam tabelas hash internamente, o que garante:

  • Acesso: O(1) - Buscar um valor por chave é quase instantâneo
  • Inserção: O(1) - Adicionar novos pares é muito rápido
  • Remoção: O(1) - Deletar elementos é eficiente
import time

# Comparação: lista vs dicionário
lista = list(range(1000000))
dicio = {i: i for i in range(1000000)}

# Buscar em lista: O(n) - LENTO
inicio = time.time()
999999 in lista
print(f"Lista: {time.time() - inicio:.6f}s")

# Buscar em dicionário: O(1) - RÁPIDO
inicio = time.time()
999999 in dicio
print(f"Dicionário: {time.time() - inicio:.6f}s")

🎓 Projeto Prático: Sistema de Cadastro

cadastro = {}

def adicionar_usuario(nome, email, idade):
    """Adiciona um novo usuário ao sistema"""
    if email in cadastro:
        print("❌ Email já cadastrado!")
        return
    
    cadastro[email] = {
        "nome": nome,
        "idade": idade,
        "data_cadastro": "2026-02-05"
    }
    print(f"✅ {nome} cadastrado com sucesso!")

def buscar_usuario(email):
    """Busca um usuário pelo email"""
    usuario = cadastro.get(email)
    
    if usuario:
        print(f"\n👤 Usuário encontrado:")
        print(f"Nome: {usuario['nome']}")
        print(f"Idade: {usuario['idade']}")
        print(f"Cadastro: {usuario['data_cadastro']}")
    else:
        print("❌ Usuário não encontrado")

def listar_usuarios():
    """Lista todos os usuários cadastrados"""
    if not cadastro:
        print("📋 Nenhum usuário cadastrado")
        return
    
    print(f"\n📋 Total de usuários: {len(cadastro)}\n")
    for email, dados in cadastro.items():
        print(f"• {dados['nome']} ({email}) - {dados['idade']} anos")

def remover_usuario(email):
    """Remove um usuário do sistema"""
    usuario = cadastro.pop(email, None)
    
    if usuario:
        print(f"🗑️ {usuario['nome']} removido com sucesso!")
    else:
        print("❌ Usuário não encontrado")

# Testando o sistema
adicionar_usuario("Ana Silva", "[email protected]", 28)
adicionar_usuario("Carlos Santos", "[email protected]", 35)
adicionar_usuario("Maria Oliveira", "[email protected]", 42)

listar_usuarios()
buscar_usuario("[email protected]")
remover_usuario("[email protected]")
listar_usuarios()

💡 Dicas e Boas Práticas

  • ✅ Use .get() para acesso seguro e evitar erros KeyError
  • ✅ Chaves devem ser imutáveis (strings, números, tuplas)
  • ✅ Dicionários são ideais quando você precisa de acesso rápido por identificador
  • ✅ Use dictionary comprehension para código mais limpo e pytônico
  • ❌ Evite usar listas ou outros dicionários como chaves
  • ❌ Não confie na ordem dos elementos em versões antigas do Python (< 3.7)

🔗 Quando Usar Dicionários?

Use dicionários quando você precisa:

  • Armazenar configurações de aplicação
  • Criar caches de dados
  • Mapear IDs para objetos
  • Contar frequência de elementos
  • Agrupar dados relacionados
  • Criar APIs e processar JSON

🚀 Próximos Passos

Agora que você domina dicionários, explore estruturas relacionadas:

Dicionários são fundamentais para qualquer desenvolvedor Python. Pratique bastante e você verá como eles facilitam a resolução de problemas complexos! 🎯