Dicionários, compreensões e critérios para escolher a estrutura certa

📦 Dicionários: armazenamento por chave

Dicionários são coleções não ordenadas de pares chave: valor (em CPython a ordem de inserção é preservada para operações iterativas, mas o acesso é por chave) (1). Usamos dicionários quando precisamos buscar por rótulos ao invés de índices numéricos.

Associative array
This graph compares the average number of CPU cache misses required to look up elements in large hash tables (far exceeding size of the cache) with chaining and linear probing. Linear probing performs better due to better locality of reference, though as the table gets full, its performance degrades drastically.

Operações úteis

  • val = d[k] — acessa (KeyError se inexistente).
  • val = d.get(k, default) — acessa com valor padrão se chave ausente.
  • d.keys(), d.values(), d.items() — iteradores úteis para percorrer o conteúdo.
  • del d[k] ou d.pop(k) — remover pares.

Compreensões

Assim como listas, podemos criar dicionários de forma concisa com compreensões:

# Dicionário de quadrados
squares = {x: x*x for x in range(6)}
# Usando get para consulta segura
valor = squares.get(10, 'não encontrado')

Compreensões deixam o código mais curto e frequentemente mais claro — mas evite compreensões muito complexas: prefira legibilidade (2).

graph TD; A[Dados do problema] --> B{Precisa de acesso por índice?}; B -- Sim --> C[Listas ou tuplas]; B -- Não --> D{Acesso por rótulo?}; D -- Sim --> E[Dicionário]; D -- Não --> C; C --> F[Escolha: Tupla se imutável, Lista se modificar]
Atividade prática:
  1. Construa um dicionário de contatos: use o nome como chave e número como valor.
  2. Implemente uma função que retorna o número ou uma mensagem 'não encontrado' usando get.
  3. Crie um dict comprehension que transforme uma lista de nomes em um mapa para suas iniciais.

Documentação e guias práticos detalham os métodos, iteração e boas práticas para dicionários e compreensões (1)(3).