---
title: "Dicionarios em Python: Como Usar e Quando Escolher"
url: "https://python.dev.br/algoritmos/dicionarios-python/"
markdown_url: "https://python.dev.br/algoritmos/dicionarios-python.MD"
description: "Aprenda dicionarios em Python: criacao, CRUD, dict comprehension, defaultdict, Counter, hash tables e quando usar dicionarios vs listas. Guia pratico completo."
date: "2026-04-27"
author: "Equipe Python Brasil"
---

# Dicionarios em Python: Como Usar e Quando Escolher

Aprenda dicionarios em Python: criacao, CRUD, dict comprehension, defaultdict, Counter, hash tables e quando usar dicionarios vs listas. Guia pratico completo.


## O que sao Dicionarios em Python?

Dicionarios sao a segunda estrutura de dados mais importante em Python, atras apenas das [listas](/algoritmos/listas-python/). 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

```python
# 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](/blog/estruturas-de-dados-python/).

---

## Operacoes CRUD (Criar, Ler, Atualizar, Deletar)

### Leitura

```python
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

```python
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

```python
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

```python
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](/blog/geradores-iteradores-python/).

---

## Dict Comprehension

Assim como list comprehension para [listas](/algoritmos/listas-python/), dict comprehension cria dicionarios de forma concisa:

```python
# 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

```python
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

```python
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

```python
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:

1. **Funcao hash**: Quando voce insere `d["chave"] = valor`, Python calcula `hash("chave")` para determinar onde armazenar o par
2. **Indice do array**: O hash e convertido em um indice de um array interno
3. **Colisoes**: Quando duas chaves geram o mesmo indice, Python usa probing (open addressing) para encontrar o proximo slot vazio
4. **Redimensionamento**: Quando o array fica 2/3 cheio, Python cria um novo array maior e redistribui todos os pares

```python
# 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](/algoritmos/listas-python/) |
| Busca rapida por chave | Dicionario |
| Verificar pertencimento | Set |
| Dados imutaveis | Tupla |
| Contagem de elementos | Counter |
| Fila/pilha | [deque](/algoritmos/pilhas-filas-python/) |
| Busca em dados ordenados | [bisect](/algoritmos/busca-binaria-python/) |

Para uma visao completa de quando usar cada estrutura, confira nosso artigo sobre [estruturas de dados](/blog/estruturas-de-dados-python/).

---

## Padroes Comuns com Dicionarios

### Merge de Dicionarios (Python 3.9+)

```python
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

```python
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](/blog/pattern-matching-python-match-case/).

---

## Boas Praticas

1. **Use `.get()` para acessos seguros** — evita KeyError
2. **Prefira `defaultdict`** quando precisa de valores padrao
3. **Use dict comprehension** para transformacoes — e mais legivel que loops
4. **Evite chaves mutaveis** — listas e dicts nao podem ser chaves
5. **Use `Counter`** para contagens — nao reinvente a roda
6. **Considere [dataclasses](/glossario/dataclass/)** 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](/algoritmos/listas-python/), [ordenacao](/algoritmos/ordenacao-python/), [busca binaria](/algoritmos/busca-binaria-python/) e [pilhas e filas](/algoritmos/pilhas-filas-python/).

Confira tambem nossas [vagas Python](/vagas/) e veja como empresas brasileiras como [Mercado Livre](/empresas/mercado-livre-brasil/) e [Itau](/empresas/itau-unibanco/) usam Python no dia a dia.

<p>Explore tambem nossos sites sobre outras linguagens: <a href="https://golang.com.br" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', { destination: 'golang.com.br' })">Go</a>, <a href="https://rustlang.com.br" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', { destination: 'rustlang.com.br' })">Rust</a> e <a href="https://kotlin.dev.br" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', { destination: 'kotlin.dev.br' })">Kotlin</a>.</p>
