Dicionarios em Python: Como Usar e Quando Escolher
O que sao Dicionarios em Python?
Dicionarios sao a segunda estrutura de dados mais importante em Python, atras apenas das listas. Eles armazenam pares chave-valor e oferecem acesso extremamente rapido — busca, insercao e remocao em tempo O(1) na media, gracas a implementacao interna com hash tables.
Dicionarios sao ideais quando voce precisa associar dados a identificadores unicos: usuarios por ID, configuracoes por nome, contagem de palavras, cache de resultados e muito mais.
Criando Dicionarios
# Dicionario vazio
vazio = {}
vazio2 = dict()
# Dicionario com dados
pessoa = {
"nome": "Ana",
"idade": 28,
"cidade": "Sao Paulo",
"linguagens": ["Python", "JavaScript"]
}
# A partir de lista de tuplas
pares = dict([("a", 1), ("b", 2), ("c", 3)])
# Com dict()
config = dict(host="localhost", porta=5432, debug=True)
# Dict comprehension
quadrados = {x: x ** 2 for x in range(1, 6)}
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
As chaves devem ser imutaveis (strings, numeros, tuplas). Valores podem ser qualquer tipo. Para entender melhor tipos de dados, veja nosso artigo sobre estruturas de dados Python.
Operacoes CRUD (Criar, Ler, Atualizar, Deletar)
Leitura
pessoa = {"nome": "Ana", "idade": 28, "cidade": "SP"}
# Acesso direto — levanta KeyError se nao existir
print(pessoa["nome"]) # "Ana"
# Acesso seguro com get — retorna None ou valor padrao
print(pessoa.get("email")) # None
print(pessoa.get("email", "N/A")) # "N/A"
# Verificar se chave existe
if "idade" in pessoa:
print(f"Idade: {pessoa['idade']}")
Criacao e Atualizacao
pessoa = {"nome": "Ana", "idade": 28}
# Adicionar/atualizar valor
pessoa["email"] = "ana@email.com"
pessoa["idade"] = 29
# Atualizar multiplos valores
pessoa.update({"cidade": "RJ", "cargo": "Dev Python"})
# setdefault — define valor apenas se chave nao existir
pessoa.setdefault("pais", "Brasil") # Adiciona
pessoa.setdefault("nome", "Carlos") # Nao altera (ja existe)
Remocao
pessoa = {"nome": "Ana", "idade": 28, "cidade": "SP", "email": "ana@email.com"}
# Remover e retornar valor
email = pessoa.pop("email")
# "ana@email.com"
# Remover com valor padrao (sem erro se nao existir)
fone = pessoa.pop("telefone", "Nao informado")
# Remover ultimo par inserido
ultimo_par = pessoa.popitem()
# Remover por chave
del pessoa["cidade"]
# Limpar tudo
pessoa.clear()
Iterando sobre Dicionarios
config = {"host": "localhost", "porta": 5432, "db": "app_prod"}
# Iterar sobre chaves (padrao)
for chave in config:
print(chave)
# Iterar sobre valores
for valor in config.values():
print(valor)
# Iterar sobre pares chave-valor
for chave, valor in config.items():
print(f"{chave} = {valor}")
# Dict comprehension com filtro
grandes = {k: v for k, v in config.items() if isinstance(v, int) and v > 100}
Para mais sobre iteracao em Python, confira nosso artigo sobre geradores e iteradores.
Dict Comprehension
Assim como list comprehension para listas, dict comprehension cria dicionarios de forma concisa:
# Inverter chave e valor
original = {"a": 1, "b": 2, "c": 3}
invertido = {v: k for k, v in original.items()}
# {1: "a", 2: "b", 3: "c"}
# Filtrar items
notas = {"Ana": 8.5, "Carlos": 6.0, "Maria": 9.2, "Pedro": 4.5}
aprovados = {nome: nota for nome, nota in notas.items() if nota >= 7.0}
# {"Ana": 8.5, "Maria": 9.2}
# Transformar valores
precos_usd = {"camiseta": 20, "calcado": 80, "jaqueta": 150}
precos_brl = {item: preco * 5.2 for item, preco in precos_usd.items()}
# A partir de duas listas
chaves = ["nome", "idade", "cidade"]
valores = ["Ana", 28, "SP"]
pessoa = dict(zip(chaves, valores))
collections: defaultdict, Counter e OrderedDict
O modulo collections oferece variantes poderosas de dicionarios:
defaultdict
from collections import defaultdict
# Agrupar items sem verificacao manual
palavras = ["python", "java", "python", "go", "python", "java"]
# Sem defaultdict (verboso)
contagem = {}
for p in palavras:
if p not in contagem:
contagem[p] = 0
contagem[p] += 1
# Com defaultdict (limpo)
contagem = defaultdict(int)
for p in palavras:
contagem[p] += 1
# defaultdict(int, {'python': 3, 'java': 2, 'go': 1})
# Agrupar em listas
alunos = [("Python", "Ana"), ("Java", "Carlos"), ("Python", "Maria")]
turmas = defaultdict(list)
for curso, aluno in alunos:
turmas[curso].append(aluno)
# {'Python': ['Ana', 'Maria'], 'Java': ['Carlos']}
Counter
from collections import Counter
# Contar elementos
texto = "abracadabra"
contagem = Counter(texto)
# Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
# Top N mais comuns
print(contagem.most_common(3))
# [('a', 5), ('b', 2), ('r', 2)]
# Operacoes entre Counters
vendas_jan = Counter({"produto_a": 50, "produto_b": 30})
vendas_fev = Counter({"produto_a": 40, "produto_b": 60})
total = vendas_jan + vendas_fev
# Counter({'produto_b': 90, 'produto_a': 90})
OrderedDict
from collections import OrderedDict
# Util quando a ordem importa para comparacao
d1 = OrderedDict([("a", 1), ("b", 2)])
d2 = OrderedDict([("b", 2), ("a", 1)])
print(d1 == d2) # False (ordem diferente)
# Com dict normal, ordem nao afeta igualdade
print({"a": 1, "b": 2} == {"b": 2, "a": 1}) # True
Como Hash Tables Funcionam
Dicionarios Python sao implementados como hash tables. Entender isso ajuda a escrever codigo mais eficiente:
- Funcao hash: Quando voce insere
d["chave"] = valor, Python calculahash("chave")para determinar onde armazenar o par - Indice do array: O hash e convertido em um indice de um array interno
- Colisoes: Quando duas chaves geram o mesmo indice, Python usa probing (open addressing) para encontrar o proximo slot vazio
- Redimensionamento: Quando o array fica 2/3 cheio, Python cria um novo array maior e redistribui todos os pares
# Apenas tipos hashaveis podem ser chaves
print(hash("texto")) # Funciona
print(hash(42)) # Funciona
print(hash((1, 2, 3))) # Funciona (tupla e imutavel)
# hash([1, 2, 3]) # TypeError! Listas sao mutaveis
Complexidade de Operacoes
| Operacao | Media | Pior Caso |
|---|---|---|
| Busca por chave | O(1) | O(n) |
| Insercao | O(1) | O(n) |
| Remocao | O(1) | O(n) |
| Iteracao | O(n) | O(n) |
O pior caso O(n) so acontece quando muitas chaves colidem — extremamente raro na pratica.
Quando Usar Dicionarios vs Outras Estruturas
| Cenario | Melhor Estrutura |
|---|---|
| Colecao ordenada com indice | Lista |
| Busca rapida por chave | Dicionario |
| Verificar pertencimento | Set |
| Dados imutaveis | Tupla |
| Contagem de elementos | Counter |
| Fila/pilha | deque |
| Busca em dados ordenados | bisect |
Para uma visao completa de quando usar cada estrutura, confira nosso artigo sobre estruturas de dados.
Padroes Comuns com Dicionarios
Merge de Dicionarios (Python 3.9+)
config_padrao = {"tema": "claro", "idioma": "pt-br", "debug": False}
config_usuario = {"tema": "escuro", "fonte": 16}
# Operador merge (Python 3.9+)
config_final = config_padrao | config_usuario
# {"tema": "escuro", "idioma": "pt-br", "debug": False, "fonte": 16}
# Merge in-place
config_padrao |= config_usuario
Dicionario como Switch/Match
def calcular(a, b, operacao):
operacoes = {
"soma": lambda: a + b,
"subtracao": lambda: a - b,
"multiplicacao": lambda: a * b,
"divisao": lambda: a / b if b != 0 else "Erro: divisao por zero"
}
return operacoes.get(operacao, lambda: "Operacao invalida")()
print(calcular(10, 3, "soma")) # 13
Para alternativas modernas, veja nosso artigo sobre pattern matching com match/case.
Boas Praticas
- Use
.get()para acessos seguros — evita KeyError - Prefira
defaultdictquando precisa de valores padrao - Use dict comprehension para transformacoes — e mais legivel que loops
- Evite chaves mutaveis — listas e dicts nao podem ser chaves
- Use
Counterpara contagens — nao reinvente a roda - Considere dataclasses quando o dict tem estrutura fixa
Conclusao
Dicionarios sao indispensaveis em Python. Sua busca O(1), flexibilidade e as poderosas extensoes do modulo collections fazem deles a escolha certa para inumeros problemas. Domine dicionarios e voce estara pronto para enfrentar desafios reais de programacao.
Continue sua jornada em algoritmos e estruturas de dados: listas, ordenacao, busca binaria e pilhas e filas.
Confira tambem nossas vagas Python e veja como empresas brasileiras como Mercado Livre e Itau usam Python no dia a dia.
Explore tambem nossos sites sobre outras linguagens: Go, Rust e Kotlin.