Dicionários
Listas permitem que você busque coisas pela posição. Mas frequentemente você quer buscar algo pelo nome. Não "me dê o item 3", mas "me dê a pontuação da Ana". Um dicionário armazena dados como pares chave-valor: você busca um valor pela sua chave, não pela posição.
Criando um dicionário
Chaves ({}) com dois pontos entre cada chave e valor, e vírgulas entre os pares. As chaves são quase sempre strings. Os valores podem ser qualquer coisa: números, strings, outras listas, até outros dicionários.
player = {
"name": "Ana",
"score": 87,
"level": 5,
"alive": True,
}Acessando valores
Use colchetes com a chave para obter o valor. Se a chave não existir, o Python levanta um KeyError. Use .get() quando você não tem certeza se uma chave está lá: ele retorna None em vez de quebrar, ou um valor padrão que você especificar.
player = {"name": "Ana", "score": 87}
player["name"] # "Ana"
player["score"] # 87
player["lives"] # KeyError (chave não existe)player.get("score") # 87
player.get("lives") # None (sem erro, retorna None por padrão)
player.get("lives", 3) # 3 (use este padrão se a chave estiver ausente).get() é mais seguro sempre que uma chave pode estar ausente:
count = inventory.get("arrows", 0) # 0 se "arrows" não estiver no dictAdicionando e atualizando
Atribua a uma chave com colchetes. Se a chave já existir, o valor é substituído. Se ainda não existir, uma nova entrada é criada. Use .update() para mesclar um dicionário inteiro de uma só vez.
player = {"name": "Ana", "score": 87}
player["score"] = 92 # atualiza valor existente
player["level"] = 5 # adiciona nova chaveextras = {"level": 5, "alive": True}
player.update(extras) # adiciona/sobrescreve com as chaves de extrasRemovendo itens
Quatro maneiras de remover entradas. .pop() remove uma chave e devolve o valor. .pop() com um padrão é seguro quando a chave pode não estar lá. del remove uma chave sem valor de retorno. .clear() esvazia o dicionário inteiro.
player = {"name": "Ana", "score": 87, "level": 5}
player.pop("level") # remove "level" e retorna 5
player.pop("lives", None) # pop seguro, retorna None se chave ausente
del player["score"] # remove "score", sem valor de retorno
player.clear() # remove tudo.pop() com um padrão é a maneira mais segura de remover uma chave que pode não existir.
Iterando
Três visualizações permitem que você percorra diferentes partes de um dicionário. Iterar apenas o dict te dá as chaves. .values() dá os valores. .items() dá ambos de uma vez e é o que você usará mais: desempacote cada par em dois nomes para laços limpos e legíveis.
player = {"name": "Ana", "score": 87, "level": 5}
for key in player: # itera as chaves (mais comum)
print(key)
for key in player.keys(): # mesma coisa, visualização explícita de chaves
print(key)
for value in player.values(): # apenas os valores
print(value)
for key, value in player.items(): # ambos, mais útil
print(f"{key}: {value}").items() é o que você usará mais. Desempacotar cada par em dois nomes torna o laço legível.
Verificando pertencimento
in verifica se uma chave existe no dicionário. Não verifica valores, apenas chaves. Para verificar se algo não está presente, use not in.
player = {"name": "Ana", "score": 87}
"name" in player # True
"lives" in player # False
"lives" not in player # Truein verifica apenas chaves. Para verificar valores, use in player.values(), embora isso raramente seja necessário.
Dicionários aninhados
Valores podem ser dicionários eles mesmos. É assim que você representa dados estruturados com múltiplos níveis: um jogador que tem uma seção de estatísticas, um arquivo de configuração com subseções. Dois conjuntos de colchetes acessam um valor aninhado: o primeiro escolhe a chave externa, o segundo escolhe a chave interna.
users = {
"ana": {"score": 87, "level": 5},
"bruno": {"score": 74, "level": 3},
}
users["ana"]["score"] # 87
users["bruno"]["level"] # 3Acesse com colchetes encadeados. Para estruturas profundamente aninhadas, isso pode ficar complicado, então mantenha o aninhamento raso quando puder.
setdefault
.setdefault() lê uma chave se ela existir, ou define-a como um valor padrão se não existir, e então retorna o valor. É útil quando você precisa que uma chave exista, mas não quer sobrescrevê-la se já estiver lá.
inventory = {}
inventory.setdefault("arrows", 0) # define "arrows": 0, retorna 0
inventory.setdefault("arrows", 10) # "arrows" já existe, sem alteração, retorna 0É útil para construir estruturas agrupadas sem verificar primeiro a existência da chave:
groups = {}
for name, team in players:
groups.setdefault(team, []).append(name)collections.defaultdict e Counter
A biblioteca padrão tem duas subclasses de dict que lidam com padrões comuns automaticamente. defaultdict cria um valor padrão para chaves ausentes, então você nunca recebe um KeyError. Counter conta quantas vezes cada item aparece em uma sequência e te dá os resultados como um dict.
import de collections
defaultdict e Counter precisam ser importados da biblioteca padrão. Imports são abordados no capítulo Módulos.
from collections import defaultdict
groups = defaultdict(list)
for name, team in players:
groups[team].append(name) # sem KeyError se o time for novofrom collections import Counter
words = ["cat", "dog", "cat", "bird", "cat", "dog"]
counts = Counter(words)
# Counter({'cat': 3, 'dog': 2, 'bird': 1})
counts.most_common(2) # [('cat', 3), ('dog', 2)]Counter poupa muito código repetitivo de "contar coisas em um laço".
Na prática
Construindo um rastreador de pontuação e imprimindo um resumo com todas as entradas:
scores = {"Ana": 87, "Bruno": 74, "Carla": 92, "Diego": 55}
total = sum(scores.values())
average = total / len(scores)
print(f"Players: {len(scores)}")
print(f"Average: {average:.1f}")
print(f"Highest: {max(scores.values())}")
print(f"Lowest: {min(scores.values())}")
print()
for name, score in scores.items():
print(f" {name}: {score}")
