Capítulo 21, Básico
Dicionários
O dicionário associa chaves a valores e é a estrutura mais poderosa da linguagem. Ele aparece em toda parte, de configurações a respostas de API.
Código deste capítulo: basico/cap21_dicionarios.py
Chaves e valores
Um dicionário guarda pares chave: valor. Desde o Python 3.7, ele preserva a ordem de inserção. As chaves precisam ser hashable (strings, números, tuplas) e únicas:
pessoa = {"nome": "Ana", "idade": 30}
print(pessoa["nome"])
pessoa["cidade"] = "Recife"
pessoa["idade"] = 31
del pessoa["nome"]
print(pessoa)
Ana
{'idade': 31, 'cidade': 'Recife'}
Acessar com segurança
Ler uma chave que não existe levanta KeyError. O método get devolve um valor padrão no lugar, e o operador in pergunta se a chave existe:
try:
pessoa["email"]
except KeyError as erro:
print("KeyError:", erro)
print(pessoa.get("email"))
print(pessoa.get("email", "sem email"))
print("idade" in pessoa)
KeyError: 'email'
None
sem email
True
Percorrer e alterar
estoque = {"maçã": 10, "pera": 0, "uva": 25}
for fruta, quantidade in estoque.items():
print(f"{fruta}: {quantidade}")
print(list(estoque.keys()))
print(list(estoque.values()))
estoque.update({"pera": 5, "kiwi": 3})
print(estoque.pop("kiwi"))
print(estoque.setdefault("manga", 0))
print(estoque)
maçã: 10
pera: 0
uva: 25
['maçã', 'pera', 'uva']
[10, 0, 25]
3
0
{'maçã': 10, 'pera': 5, 'uva': 25, 'manga': 0}
Para juntar dois dicionários, o operador | (Python 3.9 ou superior) e o desempacotamento com ** dão o mesmo resultado, e em caso de chave repetida vence o da direita:
a = {"x": 1, "y": 2}
b = {"y": 20, "z": 30}
print(a | b)
print({**a, **b})
{'x': 1, 'y': 20, 'z': 30}
{'x': 1, 'y': 20, 'z': 30}
Contar e agrupar
Contar ocorrências é uma das tarefas mais comuns. A versão manual usa get. A biblioteca padrão tem ferramentas prontas, Counter e defaultdict:
from collections import Counter, defaultdict
palavras = ["a", "b", "a", "c", "b", "a"]
contagem = {}
for palavra in palavras:
contagem[palavra] = contagem.get(palavra, 0) + 1
print(contagem)
print(Counter(palavras))
print(Counter(palavras).most_common(1))
por_inicial = defaultdict(list)
for nome in ["Ana", "Alice", "Bia", "Caio", "Beto"]:
por_inicial[nome[0]].append(nome)
print(dict(por_inicial))
{'a': 3, 'b': 2, 'c': 1}
Counter({'a': 3, 'b': 2, 'c': 1})
[('a', 3)]
{'A': ['Ana', 'Alice'], 'B': ['Bia', 'Beto'], 'C': ['Caio']}
Dados aninhados
Dicionários e listas se combinam livremente. É assim que chegam os dados de uma API em JSON:
pedido = {
"cliente": "Ana",
"itens": [
{"produto": "caneta", "qtd": 2},
{"produto": "caderno", "qtd": 1},
],
}
total_itens = 0
for item in pedido["itens"]:
total_itens += item["qtd"]
print(total_itens)
3
Exercício 1
Frequência de cada elemento
Escreva frequencia(itens) que devolva um dicionário com a contagem de cada item, sem usar Counter.
Exercício 2
Somar dicionários
Escreva somar_dicts(d1, d2) que junte os dois somando os valores das chaves em comum. Para {"a": 5, "b": 3} e {"b": 4, "c": 2}, o resultado é {"a": 5, "b": 7, "c": 2}.