Como funcionam os dicionários em Python
Depois de trabalhar com listas e tuplas, você já sabe como guardar vários valores juntos. Mas conforme seus programas crescem, surge um desafio comum: como acessar rapidamente as informações certas sem depender da posição de cada item?
Imagine uma lista com centenas de elementos. Para encontrar algo, você teria que lembrar o índice exato ou percorrer todos os valores. Conforme a quantidade de informações for crescendo, isso vai ficando cada vez mais inviável.
Os dicionários resolvem esse problema trazendo um jeito mais natural, legível e prático de organizar dados. Eles permitem acessar informações por seu nome e não sua posição.
Nas coleções que vimos até agora, guardamos apenas valores isolados, sem um "rótulo" que indique o que cada elemento representa. Mas no mundo real, dados raramente são apenas valores avulsos. Eles têm significado e uma lista como esta poderia ser difícil de interpretar:
1professor = ["Carolina", "Ciência da Computação", "Python", 4]
Apesar de não ter certeza, podemos até intuir que Carolina é o nome da professora, mas e as demais informações? Os valores "Ciência da Computação", "Python" e 4 não são claros o suficiente para sabermos o que eles representam.
Já um dicionário deixa tudo explícito! Ele armazena informações no formato chave: valor.
Cada chave funciona como uma etiqueta que identifica um dado específico, então você sabe exatamente o que quer dizer cada valor:
1professor = { 2 "nome": "Carolina", 3 "formação": "Ciência da Computação", 4 "ensina": "Python",
O nome da professora é Carolina, ela tem formação em Ciência da Computação, a disciplina que ela ensina é Python e ela tem 4 anos de experiência. Assim fica muito mais fácil, não é?
Para além do seu formato, dicionários são coleções:
Fique de olho! Se você estiver usando uma versão desatualizada ou for trabalhar em projetos antigos, também chamados de projetos legados, lembre-se que os dicionários não eram ordenados antes da versão 3.7 do Python. Tratá-los como ordenados pode causar problemas nesse caso!
Quando dizemos acima que um dicionário é mutável, queremos dizer que você pode adicionar, mudar ou remover os pares chave-valor que ele guarda.
Porém, suas chaves precisam ser imutáveis. Isso garante que elas permaneçam constantes e possam ser usadas para identificar valores de forma confiável.
Se elas pudessem mudar depois de criadas, seria como trocar o rótulo de uma caixa sem avisar as pessoas que a utilizam: elas tentariam buscar um valor usando o nome antigo e não encontrariam nada. Na prática, isso deixaria o acesso aos dados imprevisível e faria você "perder" informações que ainda estão lá, mas não podem mais ser encontradas pela chave ter mudado.
Para que isso não aconteça:
| Podem ser usados como chaves | Não podem ser usados como chaves |
|---|---|
strings (str) | listas (list) |
números (int, float e complex) | tuplas (tuple) com itens mutáveis |
booleanos (bool) | dicionários (dict) |
conjuntos imutáveis (frozenset) | conjuntos mutáveis (set) |
tuplas (tuple) só com itens imutáveis |
Apesar de ser possível, na prática é raro utilizarmos a maioria dos tipos acima como chaves dos nossos dicionários. Na maioria dos casos, você verá apenas str e int sendo utilizados.
Já os valores que cada chave guarda podem ser de qualquer tipo, não há restrição.
Lembra que nos conjuntos não podemos ter valores repetidos? Nos dicionários, podemos ter valores iguais, mas não podemos ter chaves repetidas.
Se isso acontece, apenas o último valor guardado nas chaves de mesmo nome é mantido. É como se você estivesse atribuindo um novo valor à chave que já existe:
1professor = { 2 "nome": "Carolina", 3 "anos de experiência": 4, 4 "anos de experiência": 2 5
Como só pode existir uma chave chamada anos de experiência dentro do dicionário professor, o valor 4 foi descartado e 2, a informação mais recente, ficou guardada nela.
dict()Você já viu que pode criar dicionários com as chaves ({}):
1professor = { 2 "nome": "Carolina", 3 "ensina": "Python", 4 "formação": "Ciência da Computação"
Outra forma de criá-los é usando a função dict(). Veja como ela funciona:
1professor = dict(nome="Carolina", ensina="Python", formação="Ciência da Computação") 2print(professor) 3 4
Aqui, o que vem antes do símbolo de igual (nome, ensina e formação) vira uma chave no dicionário. O que vem depois dele, se torna o valor da chave que ele vai criar.
Um ponto de atenção é que, nesse formato do dict(), as chaves precisam ser escritas como identificadores válidos, parecidos com nomes de variáveis. Por isso, não dá para usar espaços, hifens, ponto, operadores e símbolos especiais (@, !, +, etc.), palavras reservadas (class, if, etc.) ou começar com números.
Se em algum momento bater dúvida sobre qual é o tipo de dado e você quiser confirmar, pode usar a função type():
1professor = dict(nome="Carolina", ensina="Python", formação="Ciência da Computação") 2print(type(professor)) 3
Ela vai retornar <class 'dict'> sempre que o valor for um dicionário.
A grande vantagem do dicionário é acessar valores de forma direta, usando a chave em vez do índice da informação:
1animal = { 2 "nome": "Pantera", 3 "especie": "Gato", 4 "nascimento": 2024,
Dessa forma, você não precisa se preocupar em lembrar a posição de um dado na coleção nem corre risco de confundir os índices no seu programa. Basta saber o nome da chave para acessar o valor que ela guarda.
Atenção: Mesmo sendo ordenados, o acesso aos valores que o dicionário guarda é feito pelas chaves que ele contém, e não por índices numéricos. Se você tentar acessar um valor usando
professor[0]ouanimal[2], você vai receber um erro.
get()Além do formato dicionario[chave], também podemos acessar valores usando a função get():
1animal = { 2 "nome": "Pantera", 3 "especie": "Gato", 4 "nascimento": 2024,
A vantagem é que o get() é mais seguro para acessar as chaves de um dicionário, pois não gera erro se a chave não existir. O código apenas retorna o valor None.
Quando acessamos com os colchetes ([]), o Python gera um erro imediatamente se a chave não existir:
1animal = {"especie": "Gato", "nascimento": 2024} 2 3print(animal.get("cor")) 4
Por isso, o get() é especialmente útil quando não temos certeza se a chave existe. Com ele, evitamos que o programa seja interrompido por um erro caso ela não exista.
Para fazer validações e evitar o erro que falamos sobre aqui em cima, podemos verificar se uma chave está no dicionário usando o operador in, que já vimos quando estudamos strings e conjuntos:
1animal = {"especie": "Gato", "nascimento": 2024} 2 3if "nascimento" in animal: 4
Isso é muito útil antes de acessar chaves que podem não existir e para tratar casos em que queremos fazer algo diferente quando elas não existem.
Dicionários podem conter outros dicionários e isso é muito comum na programação!
Eles representam estruturas mais completas e organizadas, sendo utilizados em dados vindos de APIs, configurações de sistemas e informações em formato JSON, que veremos mais a frente.
Olhe como funciona:
1familia = { 2 "mãe": { 3 "nome": "Maria", 4 "ano": 1998 5
Você também pode criar cada parte separadamente:
1mae = {"nome": "Maria", "ano": 1998} 2pai = {"nome": "Paulo", "ano": 1999}
Para acessar valores em estruturas mais profundas, percorremos as chaves passo a passo:
1print(familia["pai"]["nome"]) 2 3# Saída: 4# Paulo
Aqui, entramos no dicionário familia, acessamos primeiro a chave pai e depois a chave nome dentro dela. Assim encontramos o nome do pai dessa família: Paulo.
Agora que você já entende o que são dicionários, como funcionam e como acessar seus valores, podemos avançar para a próxima etapa: aprender a manipulá-los nos nossos códigos.