Neste capítulo, você aprenderá como usar os dicionários do Python, que permitem conectar partes de informações relacionadas. Você aprenderá como acessar as informações quando elas estiverem em um dicionário e como modificar essas informações. Como os dicionários podem armazenar uma quantidade quase ilimitada de informações, mostrarei como fazer um loop pelos dados em um dicionário. Além disso, você aprenderá a aninhar dicionários dentro de listas, listas dentro de dicionários e até mesmo dicionários dentro de outros dicionários.
Entender dicionários permite que você modele uma variedade de objetos do mundo real com mais precisão. Você poderá criar um dicionário representando uma pessoa e então armazenar quantas informações quiser sobre essa pessoa. Você pode armazenar seu nome, idade, localização, profissão e qualquer outro aspecto de uma pessoa que você possa descrever. Você poderá armazenar quaisquer dois tipos de informação que podem ser correspondidos, como uma lista de palavras e seus significados, uma lista de nomes de pessoas e seus números de telefone, uma lista de montanhas e suas elevações, e assim por diante.
Considere um jogo com alienígenas que podem ter cores e valores de pontos diferentes. Este dicionário simples armazena informações sobre um alienígena em particular:
alien_1 = {'cor': 'verde', 'pontos': 5}
print(alien_1['cor'])
print(alien_1['pontos'])
O dicionário alien_1 armazena a cor e o valor do ponto do alienígena. As duas últimas linhas acessam e exibem essas informações.
Assim como a maioria dos novos conceitos de programação, usar dicionários requer prática. Depois de trabalhar com dicionários por um tempo, você verá o quão efetivamente eles podem modelar situações do mundo real.
Um dicionário em Python é uma coleção de pares chave-valor. Cada chave é conectada a um valor, e você pode usar uma chave para acessar o valor associado a essa chave. O valor de uma chave pode ser um número, uma string, uma lista ou até mesmo outro dicionário. Na verdade, você pode usar qualquer objeto que você pode criar em Python como um valor em um dicionário.
Em Python, um dicionário é colocado entre chaves ({}) com uma série de pares de chave-valor dentro das chaves, conforme mostrado no exemplo anterior:
alien_1 = {'cor': 'verde', 'pontos': 5}
Um par chave-valor é um conjunto de valores associados entre si. Quando você fornece uma chave, o Python retorna o valor associado a essa chave. Cada chave é conectada ao seu valor por dois pontos, e pares de chave-valor individuais são separados por vírgulas. Você pode armazenar quantos pares de chave-valor quiser em um dicionário.
O dicionário mais simples tem exatamente um par chave-valor, como mostrado nesta versão modificada do dicionário alien_1:
alien_1 = {'cor': 'verde'}
Este dicionário armazena uma informação sobre alien_1: a cor do alienígena. A string 'cor' é uma chave neste dicionário, e seu valor associado é 'verde'.
Para obter o valor associado a uma chave, informe o nome do dicionário e coloque a chave dentro de um conjunto de colchetes, conforme mostrado aqui:
alien_1 = {'cor': 'verde'}
print(alien_1['cor'])
Isso retorna o valor associado à chave 'cor' do dicionário alien_1.
Você pode ter um número ilimitado de pares de chave-valor em um dicionário. Por exemplo, aqui está o dicionário original alien_1 com dois pares de chave-valor:
alien_1 = {'cor': 'verde', 'pontos': 5}
Agora você pode acessar a cor ou o valor em pontos de alien_1. Se um jogador derrubar esse alienígena, você pode procurar quantos pontos ele deve ganhar usando um código como este:
alien_1 = {'cor': 'verde', 'pontos': 5}
pontos = alien_1['pontos']
print(f'Você ganhou {pontos} pontos!')
Uma vez que o dicionário foi definido, nós puxamos o valor associado à chave 'pontos' do dicionário. Este valor é então atribuído à variável pontos. A última linha imprime uma declaração sobre quantos pontos o jogador acabou de ganhar.
Se você executar este código toda vez que um alienígena for abatido, o valor do ponto do alienígena será recuperado.
Dicionários são estruturas dinâmicas, e você pode adicionar novos pares de chave-valor a um dicionário a qualquer momento. Para adicionar um novo par de chave-valor, você daria o nome do dicionário seguido pela nova chave entre colchetes, junto com o novo valor.
Vamos adicionar duas novas informações ao dicionário alien_1: as coordenadas X e Y do alienígena, que nos ajudarão a exibir o alienígena em uma posição específica na tela. Vamos colocar o alienígena na borda esquerda da tela, 25 pixels abaixo do topo. Como as coordenadas da tela geralmente começam no canto superior esquerdo da tela, colocaremos o alienígena na borda esquerda da tela definindo a coordenada X como 0 e 25 pixels a partir do topo definindo sua coordenada Y como 25 positivo, conforme mostrado aqui:
alien_1 = {'cor': 'verde', 'pontos': 5}
print(alien_1)
alien_1['posicao_x'] = 0
alien_1['posicao_y'] = 25
print(alien_1)
Começamos definindo o mesmo dicionário com o qual estávamos trabalhando. Então imprimimos esse dicionário, exibindo um instantâneo de suas informações. Em seguida, adicionamos um novo par chave-valor ao dicionário: a chave 'posicao_x' e o valor 0. Fazemos o mesmo para a chave 'posicao_y'. Quando imprimimos o dicionário modificado, vemos os dois pares chave-valor adicionais.
A versão final do dicionário contém quatro pares de chave-valor. Os dois originais especificam cor e valor de ponto, e mais dois especificam a posição do alienígena.
Os dicionários mantêm a ordem em que foram definidos. Quando você imprime um dicionário ou faz um loop pelos seus elementos, você verá os elementos na mesma ordem em que foram adicionados ao dicionário.
Às vezes é conveniente, ou mesmo necessário, começar com um dicionário vazio e então adicionar cada novo item a ele. Para começar a preencher um dicionário vazio, defina um dicionário com um conjunto vazio de chaves e então adicione cada par chave-valor em sua própria linha. Por exemplo, aqui está como construir o dicionário alien_1 usando esta abordagem:
alien_1 = {}
alien_1['cor'] = 'verde'
alien_1['pontos'] = 5
print(alien_1)
Primeiro definimos um dicionário alien_1 vazio e, então, adicionamos valores de cor e ponto a ele. O resultado é o dicionário que usamos em exemplos anteriores.
Normalmente, você usará dicionários vazios ao armazenar dados fornecidos pelo usuário em um dicionário ou ao escrever código que gera um grande número de pares de chave-valor automaticamente.
Para modificar um valor em um dicionário, dê o nome do dicionário com a chave entre colchetes e então o novo valor que você quer associar a essa chave. Por exemplo, considere um alienígena que muda de verde para amarelo conforme o jogo avança:
alien_1 = {'cor': 'verde'}
print(f'A cor do alien é {alien_1["cor"]}')
alien_1['cor'] = 'amarelo'
print(f'Agora a cor do alien é {alien_1["cor"]}')
Primeiro definimos um dicionário para alien_1 que contém apenas a cor do alienígena; então mudamos o valor associado à chave 'cor' para 'amarelo'. A saída mostra que o alienígena realmente mudou de verde para amarelo.
Para um exemplo mais interessante, vamos rastrear a posição de um alienígena que pode se mover em velocidades diferentes. Armazenaremos um valor representando a velocidade atual do alienígena e então o usaremos para determinar o quão para a direita o alienígena deve se mover:
alien_1 = {'posicao_x': 0, 'posicao_y': 25, 'velocidade': 'media'}
print(f'Posição original no eixo X: {alien_1["posicao_x"]}')
# --- Mover o alien para a direita --- #
# --- Determienar o quão longe o alien pode ir com a velocidade atual --- #
if alien_1['velocidade'] == 'devagar': # 1
x_aumento = 1
elif alien_1['velocidade'] == 'media':
x_aumento = 2
else:
# --- Este deve ser um alienígena rápido --- #
x_auemnto = 3
# --- Nova posição é a posição antiga mais o aumento --- #
alien_1['posicao_x'] = alien_1['posicao_x'] + x_aumento # 2
print(f'Nova posição: {alien_1["posicao_x"]}')
Começamos definindo um alienígena com uma posição inicial X e Y, e uma velocidade de 'media'. Omitimos os valores de cor e ponto para simplificar, mas este exemplo funcionaria da mesma forma se você incluísse esses pares de chave-valor também. Também imprimimos o valor original de posicao_x para ver o quão longe o alienígena se move para a direita.
Uma cadeia if-elif-else determina o quão longe o alienígena deve se mover para a direita, e atribui esse valor à variável x_aumento (1). Se a velocidade do alienígena for 'devagar', ele se move uma unidade para a direita; se a velocidade for 'media', ele se move duas unidades para a direita; e se for 'rapida', ele se move três unidades para a direita. Uma vez que o incremento foi calculado, ele é adicionado ao valor de posicao_x (2), e o resultado é armazenado no posicao_x do dicionário.
Como este é um alienígena de velocidade média, sua posição muda duas unidades para a direita.
Essa técnica é bem legal: mudando um valor no dicionário do alienígena, você pode mudar o comportamento geral dele. Por exemplo, para transformar esse alienígena de velocidade média em um alienígena rápido, você adicionaria esta linha:
alien_1['velocidade'] = 'rapida'
O bloco if-elif-else atribuiria então um valor maior a x_aumento na próxima vez que o código fosse executado.
Quando você não precisa mais de uma informação armazenada em um dicionário, você pode usar a instrução del para remover completamente um par chave-valor. Tudo o que del precisa é do nome do dicionário e da chave que você quer remover.
Por exemplo, vamos remover a chave 'pontos' do dicionário alien_1, junto com seu valor:
alien_1 = {'cor': 'verde', 'pontos': 5}
print(alien_1)
del alien_1['pontos'] # 1
print(alien_1)
A declaração del (1) diz ao Python para excluir a chave 'pontos' do dicionário alien_1 e remover o valor associado a essa chave também. A saída mostra que a chave 'pontos' e seu valor de 5 são excluídos do dicionário, mas o resto do dicionário não é afetado.
Esteja ciente de que o par chave-valor excluído será removido permanentemente.
O exemplo anterior envolveu o armazenamento de diferentes tipos de informação sobre um objeto, um alienígena em um jogo. Você também pode usar um dicionário para armazenar um tipo de informação sobre muitos objetos. Por exemplo, digamos que você queira fazer uma enquete com várias pessoas e perguntar a elas qual é sua linguagem de programação favorita. Um dicionário é útil para armazenar os resultados de uma enquete simples, como esta:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
luiza': 'java',
}
Como você pode ver, nós dividimos um dicionário maior em várias linhas. Cada chave é o nome de uma pessoa que respondeu à enquete, e cada valor é sua escolha de idioma. Quando você sabe que precisará de mais de uma linha para definir um dicionário, pressione ENTER após a chave de abertura. Então, recue a próxima linha um nível (quatro espaços) e escreva o primeiro par chave-valor, seguido por uma vírgula. Deste ponto em diante, quando você pressionar ENTER, seu editor de texto deverá recuar automaticamente todos os pares chave-valor subsequentes para corresponder ao primeiro par chave-valor.
Depois de terminar de definir o dicionário, adicione uma chave de fechamento em uma nova linha após o último par chave-valor e indente-a um nível para que ela se alinhe com as chaves no dicionário. É uma boa prática incluir uma vírgula após o último par chave-valor também, para que você esteja pronto para adicionar um novo par chave-valor na próxima linha.
A maioria dos editores tem alguma funcionalidade que ajuda você a formatar listas e dicionários estendidos de forma semelhante a este exemplo. Outras maneiras aceitáveis de formatar dicionários longos também estão disponíveis, então você pode ver uma formatação ligeiramente diferente no seu editor ou em outras fontes.
Para usar este dicionário, dado o nome de uma pessoa que respondeu à enquete, você pode facilmente procurar sua linguagem favorita:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
'luiza': 'java',
}
linguagem = linguagens_favoritas['gui'].title() # 1
print(f'A linguagem favorita do Gui é {linguagem}')
Para ver qual idioma Gui escolheu, pedimos o valor em:
linguagens_favoritas['gui']
Usamos essa sintaxe para extrair a linguagem favorita de Gui do dicionário (1) e atribuí-la à variável linguagem. Criar uma nova variável aqui resulta em uma chamada print() muito mais limpa. A saída mostra a linguagem favorita de Gui.
Você pode usar essa mesma sintaxe com qualquer indivíduo representado no dicionário.
Usar chaves entre colchetes para recuperar o valor de seu interesse de um dicionário pode causar um problema potencial: se a chave solicitada não existir, você receberá um erro.
Vamos ver o que acontece quando você pergunta o valor em pontos de um alienígena que não tem um valor em pontos definido:
alien_1 = {'cor': 'verde', 'velocidade': 'devagar'}
print(alien_1['pontos'])
Isso resulta em um erro, mostrando um KeyError.
Para dicionários especificamente, você pode usar o método get() para definir um valor padrão que será retornado se a chave solicitada não existir.
O método get() requer uma chave como primeiro argumento. Como um segundo argumento opcional, você pode passar o valor a ser retornado se a chave não existir:
alien_1 = {'cor': 'verde', 'velocidade': 'devagar'}
valor_pontos = alien_1.get('pontos', 'Não há valor para a chave "pontos"')
print(valor_pontos)
Se a chave 'pontos' existir no dicionário, você obterá o valor correspondente. Se não existir, você obterá o valor padrão. Neste caso, pontos não existe, e obtemos uma mensagem limpa em vez de um erro.
Se houver uma chance de que a chave que você está solicitando não exista, considere usar o método get() em vez da notação de colchetes.
Se você deixar de fora o segundo argumento na chamada para get() e a chave não existir, Python retornará o valor None. O valor especial None significa “nenhum valor existe”. Isso não é um erro: é um valor especial que indica a ausência de um valor.
Execício 01: Use um dicionário para armazenar informações sobre uma pessoa que você conhece. Armazene seu primeiro nome, sobrenome, idade e a cidade em que vive. Você deve ter chaves como nome, sobrenome, idade e cidade. Imprima cada pedaço de informação armazenado em seu dicionário.
Exercício 02: Use um dicionário para armazenar os números favoritos das pessoas. Pense em cinco nomes e use-os como chaves em seu dicionário. Pense em um número favorito para cada pessoa e armazene cada um como um valor em seu dicionário. Imprima o nome de cada pessoa e seu número favorito.
Exercício 03: Um dicionário Python pode ser usado para modelar um dicionário real. No entanto, para evitar confusão, vamos chamá-lo de glossário:
Pense em cinco palavras de programação que você aprendeu nos capítulos anteriores. Use essas palavras como chaves em seu glossário e armazene seus significados como valores.
Imprima cada palavra e seu significado como uma saída bem formatada. Você pode imprimir a palavra seguida por dois pontos e então seu significado, ou imprimir a palavra em uma linha e então imprimir seu significado recuado em uma segunda linha. Use o caractere de nova linha (\n) para inserir uma linha em branco entre cada par palavra-significado em sua saída.
Um único dicionário Python pode conter apenas alguns pares de chave-valor ou milhões de pares. Como um dicionário pode conter grandes quantidades de dados, o Python permite que você faça um loop por um dicionário. Dicionários podem ser usados para armazenar informações de várias maneiras; portanto, existem várias maneiras diferentes de fazer um loop por eles. Você pode fazer um loop por todos os pares de chave-valor de um dicionário, por suas chaves ou por seus valores.
Antes de explorarmos as diferentes abordagens para looping, vamos considerar um novo dicionário projetado para armazenar informações sobre um usuário em um site. O seguinte dicionário armazenaria o nome de usuário, o primeiro nome e o último nome de uma pessoa:
usuario = {
'nome_usuario': 'efermi',
'nome': 'enrico',
'sobrenome': 'fermi'
}
Você pode acessar qualquer pedaço de informação sobre usuario com base no que você já aprendeu neste capítulo. Mas e se você quisesse ver tudo armazenado no dicionário deste usuário? Para fazer isso, você poderia fazer um loop pelo dicionário usando um loop for:
usuario = {
'nome_usuario': 'efermi',
'nome': 'enrico',
'sobrenome': 'fermi'
}
for chave, valor in usuario.items():
print(f'\nChave: {chave}')
print(f'Valor: {valor}')
Para escrever um loop for para um dicionário, você cria nomes para as duas variáveis que manterão a chave e o valor em cada par chave-valor. Você pode escolher quaisquer nomes que desejar para essas duas variáveis. Este código funcionaria tão bem se você tivesse usado abreviações para os nomes das variáveis, como este:
for c, v in usuario.items()
A segunda metade da declaração for inclui o nome do dicionário seguido pelo método items(), que retorna uma sequência de pares chave-valor. O loop for então atribui cada um desses pares às duas variáveis fornecidas. No exemplo anterior, usamos as variáveis para imprimir cada chave, seguida pelo valor associado. O '\n' na primeira chamada print() garante que uma linha em branco seja inserida antes de cada par chave-valor na saída.
O método keys() é útil quando você não precisa trabalhar com todos os valores em um dicionário. Vamos percorrer um dicionário e imprimir os nomes de todos que responderam à enquete:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
'luiza': 'java',
}
for nome in linguagens_favoritas.keys():
print(nome.title())
Este loop for diz ao Python para puxar todas as chaves do dicionário linguagens_favoritas e atribuí-las uma de cada vez à variável nome. A saída mostra os nomes de todos que responderam à enquete.
Na verdade, o comportamento padrão ao executar um loop em um dicionário é executar um loop pelas chaves, então esse código teria exatamente a mesma saída se você escrevesse:
for nome in linguagens_favoritas:
Em vez de:
for nome in linguagens_favoritas.keys():
Você pode escolher usar o método keys() explicitamente se ele tornar seu código mais fácil de ler, ou pode omiti-lo se desejar.
Você pode acessar o valor associado a qualquer chave que lhe interessa dentro do loop, usando a chave atual. Vamos imprimir uma mensagem para alguns amigos sobre as linguagens que eles escolheram. Faremos um loop pelos nomes no dicionário como fizemos anteriormente, mas quando o nome corresponder a um de nossos amigos, exibiremos uma mensagem sobre o idioma favorito deles:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
'luiza': 'java',
}
amigos = ['maria', 'gui']
for nome in linguagens_favoritas.keys():
print(f'Olá, {nome.title()}')
if nome in amigos: # 1
linguagem = linguagens_favoritas[nome].title() # 2
print(f'\t{nome.title()}, eu vi que você gosta da linguagem {linguagem}!')
Primeiro, fazemos uma lista de amigos para os quais queremos imprimir uma mensagem. Dentro do loop, imprimimos o nome de cada pessoa. Então, verificamos se o nome com o qual estamos trabalhando está na lista amigos (1). Se estiver, determinamos o idioma favorito da pessoa usando o nome do dicionário e o valor atual de nome como a chave (2). Então, imprimimos uma saudação especial, incluindo uma referência ao idioma de sua escolha. O nome de todos é impresso, mas nossos amigos recebem uma mensagem especial.
Você também pode usar o método keys() para descobrir se uma pessoa em particular foi pesquisada. Desta vez, vamos descobrir se o Lucas fez a pesquisa:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
'luiza': 'java',
}
if 'lucas' not in linguagens_favoritas.keys():
print('Faça a pesquisa, Lucas!')
O método keys() não serve apenas para loop: ele na verdade retorna uma sequência de todas as chaves, e a declaração if simplesmente verifica se 'lucas' está nessa sequência. Como ela não está, uma mensagem é impressa convidando-a a participar da enquete.
Fazer um loop em um dicionário retorna os itens na mesma ordem em que foram inseridos. Às vezes, porém, você vai querer fazer um loop em um dicionário em uma ordem diferente.
Uma maneira de fazer isso é classificar as chaves conforme elas são retornadas no loop for. Você pode usar a função sorted() para obter uma cópia das chaves em ordem:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
'luiza': 'java',
}
for nome in sorted(linguagens_favoritas.keys()):
print(f'{nome.title()}, muito obrigado pela enquete!')
Esta declaração for é como outras declarações for, exceto que envolvemos a função sorted() em torno do método dicionario.keys(). Isso diz ao Python para obter todas as chaves no dicionário e classificá-las antes de iniciar o loop. A saída mostra todos que responderam à enquete, com os nomes exibidos em ordem.
Se você estiver interessado principalmente nos valores que um dicionário contém, você pode usar o método values() para retornar uma sequência de valores sem nenhuma chave. Por exemplo, digamos que queremos simplesmente uma lista de todas as linguagens escolhidas em nossa enquete de linguagem de programação, sem o nome da pessoa que escolheu cada linguagem:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
'luiza': 'java',
'bruno': 'python'
}
print('As seguintes linguages foram escolhidas:')
for linguagem in linguagens_favoritas.values():
print(linguagem.title())
A declaração for aqui puxa cada valor do dicionário e o atribui à variável linguagem. Quando esses valores são impressos, obtemos uma lista de todos as linguagens escolhidas.
Essa abordagem extrai todos os valores do dicionário sem verificar repetições. Isso pode funcionar bem com um pequeno número de valores, mas em uma pesquisa com um grande número de respondentes, resultaria em uma lista muito repetitiva. Para ver cada idioma escolhido sem repetição, podemos usar um set(). Um set() é uma coleção na qual cada item deve ser único:
linguagens_favoritas = {
'joão': 'c',
'gui': 'python',
'maria': 'rust',
'luiza': 'java',
'bruno': 'python'
}
print('As seguintes linguages foram escolhidas:')
for linguagem in set(linguagens_favoritas.values()):
print(linguagem.title())
Quando você envolve set() em torno de uma coleção de valores que contém itens duplicados, o Python identifica os itens únicos na coleção e constrói um conjunto a partir desses itens. Aqui usamos set() para extrair as linguagens únicas em linguagens_favoritas.values().
O resultado é uma lista não repetitiva de idiomas que foram mencionados pelas pessoas que participaram da pesquisa.
À medida que você continua aprendendo sobre Python, muitas vezes você encontrará um recurso integrado da linguagem que o ajuda a fazer exatamente o que deseja com seus dados.
Você pode construir um conjunto diretamente usando chaves e separando os elementos com vírgulas:
linguagens = {'python', 'java', 'c++', 'python'}
print(linguagens)
É fácil confundir conjuntos com dicionários porque ambos estão entre chaves. Quando você vê chaves, mas nenhum par chave-valor, provavelmente está olhando para um conjunto. Ao contrário de listas e dicionários, conjuntos não retêm itens em nenhuma ordem específica.
Exercício 04: Agora que você sabe como fazer um loop por um dicionário, limpe o código do exercício 3 substituindo sua série de chamadas print() por um loop que percorre as chaves e valores do dicionário. Quando tiver certeza de que seu loop funciona, adicione mais quatro termos Python ao seu glossário. Quando você executar seu programa novamente, essas novas palavras e significados devem ser incluídos automaticamente na saída:
Exercício 05: Crie um dicionário contendo três rios principais e o país que cada rio atravessa. Um par de chave-valor pode ser 'nilo': 'egito':
Use um loop para imprimir uma frase sobre cada rio, como O Nilo atravessa o Egito.
Use um loop para imprimir o nome de cada rio incluído no dicionário.
Use um loop para imprimir o nome de cada país incluído no dicionário.
Exercício 06: Faça uma lista de pessoas que devem participar da enquete de linguagens favoritas. Inclua alguns nomes que já estão no dicionário e alguns que não estão:
Percorra a lista de pessoas que devem responder à enquete. Se elas já responderam à enquete, imprima uma mensagem agradecendo por responderem. Se elas ainda não responderam à enquete, imprima uma mensagem convidando-as a responder à enquete.
Às vezes, você vai querer armazenar vários dicionários em uma lista, ou uma lista de itens como um valor em um dicionário. Isso é chamado de aninhamento. Você pode aninhar dicionários dentro de uma lista, uma lista de itens dentro de um dicionário, ou até mesmo um dicionário dentro de outro dicionário. O aninhamento é um recurso poderoso, como os exemplos a seguir demonstrarão.
O dicionário alien_1 contém uma variedade de informações sobre um alienígena, mas não tem espaço para armazenar informações sobre um segundo alienígena, muito menos uma tela cheia de alienígenas. Como você pode gerenciar uma frota de alienígenas? Uma maneira é fazer uma lista de alienígenas em que cada alienígena é um dicionário de informações sobre aquele alienígena. Por exemplo, o código a seguir cria uma lista de três alienígenas:
alien_1 = {'cor': 'verde', 'pontos': 5}
alien_2 = {'cor': 'amarelo', 'pontos': 10}
alien_3 = {'cor': 'vermelho', 'pontos': 15}
aliens = [alien_1, alien_2, alien_3] # 1
for alien in aliens:
print(alien)
Primeiro criamos três dicionários, cada um representando um alienígena diferente. Armazenamos cada um desses dicionários em uma lista chamada aliens (1). Finalmente, fazemos um loop pela lista e imprimimos cada alienígena.
Um exemplo mais realista envolveria mais de três alienígenas com código que gera cada alienígena automaticamente. No exemplo a seguir, usamos range() para criar uma frota de 30 alienígenas:
# --- Criar uma lista vazia para adicionar os aliens --- #
aliens = []
# --- Criar 30 aliens verde --- #
for alien_numero in range(30): # 1
novo_alien = {'cor': 'verde', 'pontos': 5, 'velocidade': 'devagar'} # 2
aliens.append(novo_alien) # 3
# --- Mostrar os 5 primeiros aliens --- #
for alien in aliens[:5]: # 4
print(alien)
# --- Mostrar quantos aliens foram criados --- #
print(f'Total de aliens: {len(aliens)}')
Este exemplo começa com uma lista vazia para conter todos os alienígenas que serão criados. A função range() (1) retorna uma série de números, que apenas informa ao Python quantas vezes queremos que o loop se repita. Cada vez que o loop é executado, criamos um novo alienígena (2) e então anexamos cada novo alienígena à lista aliens (3). Usamos uma fatia para imprimir os primeiros cinco alienígenas (4) e, finalmente, imprimimos o comprimento da lista para provar que realmente geramos a frota completa de 30 alienígenas. Todos esses alienígenas têm as mesmas características, mas o Python considera cada um deles um objeto separado, o que nos permite modificar cada alienígena individualmente.
Como você pode trabalhar com um grupo de alienígenas como esse? Imagine que um aspecto de um jogo tem alguns alienígenas mudando de cor e se movendo mais rápido conforme o jogo avança. Quando for a hora de mudar as cores, podemos usar um loop for e uma declaração if para mudar a cor dos alienígenas. Por exemplo, para mudar os três primeiros alienígenas para amarelos, velocidade média que valem 10 pontos cada, poderíamos fazer isso:
# --- Criar uma lista vazia para adicionar os aliens --- #
aliens = []
# --- Criar 30 aliens verde --- #
for alien_numero in range(30):
novo_alien = {'cor': 'verde', 'pontos': 5, 'velocidade': 'devagar'}
aliens.append(novo_alien)
# --- Mudar os 3 primeiros aliens --- #
for alien in aliens[:3]:
if alien['cor'] == 'verde':
alien['cor'] = 'amarelo'
alien['velocidade'] = 'media'
alien['pontos'] = 10
# --- Mostrar os 5 primeiros aliens --- #
for alien in aliens[:5]:
print(alien)
# --- Mostrar quantos aliens foram criados --- #
print(f'Total de aliens: {len(aliens)}')
Como queremos modificar os três primeiros alienígenas, fazemos um loop por uma fatia que inclui apenas os três primeiros alienígenas. Todos os alienígenas são verdes agora, mas esse não será sempre o caso, então escrevemos uma declaração if para garantir que estamos modificando apenas alienígenas verdes. Se o alienígena for verde, mudamos a cor para 'amarelo', a velocidade para 'media' e o valor do ponto para 10.
Você pode expandir esse loop adicionando um bloco elif que transforma alienígenas amarelos em vermelhos, de movimento rápido, valendo 15 pontos cada. Sem mostrar o programa inteiro novamente, esse loop ficaria assim:
if alien['cor'] == 'verde':
alien['cor'] = 'amarelo'
alien['velocidade'] = 'media'
alien['pontos'] = 10
elif alien['cor'] == 'amarelo':
alien['cor'] = 'vermelho'
alien['velocidade'] = 'rapida'
alien['pontos'] = 15
É comum armazenar vários dicionários em uma lista quando cada dicionário contém muitos tipos de informações sobre um objeto. Por exemplo, você pode criar um dicionário para cada usuário em um site, e armazenar os dicionários individuais em uma lista chamada usuarios. Todos os dicionários na lista devem ter uma estrutura idêntica, para que você possa percorrer a lista e trabalhar com cada objeto de dicionário da mesma forma.
Em vez de colocar um dicionário dentro de uma lista, às vezes é útil colocar uma lista dentro de um dicionário. Por exemplo, considere como você pode descrever uma pizza que alguém está pedindo. Se você fosse usar apenas uma lista, tudo o que você poderia realmente armazenar seria uma lista de coberturas da pizza. Com um dicionário, uma lista de coberturas pode ser apenas um aspecto da pizza que você está descrevendo.
No exemplo a seguir, dois tipos de informação são armazenados para cada pizza: o tamanho da pizza e uma lista de coberturas. A lista de coberturas é um valor associado à chave 'coberturas'. Para usar os itens na lista, damos o nome do dicionário e a chave 'coberturas', como faríamos com qualquer valor no dicionário. Em vez de retornar um único valor, obtemos uma lista de coberturas:
# --- Armazenar a informação sobre o pedido da pizza --- #
pizza = {
'tamanho': 'media',
'coberturas': ['milho', 'bacon']
}
# --- Mostrar o pedido --- #
print(f'Você pediu uma pizza {pizza["tamanho"]} com os seguintes sabores:') # 1
for cobertura in pizza['coberturas']: # 2
print(f'\t- {cobertura}')
Começamos com um dicionário que contém informações sobre uma pizza que foi pedida. Uma chave no dicionário é 'tamanho', e o valor associado é a string 'media'. A próxima chave, 'coberturas', tem uma lista como seu valor que armazena todas as coberturas solicitados. Resumimos o pedido antes de construir a pizza (1). O Python combinará automaticamente todas as strings que encontrar dentro dos parênteses. Para imprimir as coberturas, escrevemos um loop for (2). Para acessar a lista de coberturas, usamos a chave 'coberturas', e o Python pega a lista de coberturas do dicionário.
Você pode aninhar uma lista dentro de um dicionário sempre que quiser que mais de um valor seja associado a uma única chave em um dicionário. No exemplo anterior de linguagens de programação favoritas, se armazenássemos as respostas de cada pessoa em uma lista, as pessoas poderiam escolher mais de uma linguagem favorita.
Quando fazemos um loop pelo dicionário, o valor associado a cada pessoa seria uma lista de idiomas em vez de um único idioma. Dentro do loop for do dicionário, usamos outro loop for para percorrer a lista de idiomas associados a cada pessoa:
linguagens_favoritas = {
'joão': ['c', 'c#'],
'gui': ['python', 'matlab'],
'maria': ['c++', 'rust'],
'luiza': ['java', 'javascript'],
'bruno': ['python']
}
for nome, linguagens in linguagens_favoritas.items(): # 1
print(f'\n{nome.title()} gosta das linguagens:')
for linguagem in linguagens: # 2
print(f'\n- {linguagem.title()}')
O valor associado a cada nome em linguagens_favoritas agora é uma lista. Observe que algumas pessoas têm um idioma favorito e outras têm vários favoritos. Quando fazemos um loop pelo dicionário (1), usamos o nome da variável linguagens para armazenar cada valor do dicionário, porque sabemos que cada valor será uma lista. Dentro do loop do dicionário principal, usamos outro loop for (2) para percorrer a lista de idiomas favoritos de cada pessoa.
Para refinar ainda mais esse programa, você pode incluir uma declaração if no início do loop for do dicionário para ver se cada pessoa tem mais de uma língua favorita examinando o valor de len(linguagens). Se uma pessoa tiver mais de uma língua favorita, a saída permanecerá a mesma. Se a pessoa tiver apenas uma língua favorita, você pode alterar o texto para refletir isso. Por exemplo, você pode dizer: “A linguagem favorita de Bruno é Python”.
Você não deve aninhar listas e dicionários muito profundamente. Se você estiver aninhando itens muito mais profundamente do que o que vê nos exemplos anteriores, ou se estiver trabalhando com o código de outra pessoa com níveis significativos de aninhamento, provavelmente há uma maneira mais simples de resolver o problema.
Você pode aninhar um dicionário dentro de outro dicionário, mas seu código pode ficar complicado rapidamente quando você faz isso. Por exemplo, se você tiver vários usuários para um site, cada um com um nome de usuário exclusivo, você pode usar os nomes de usuário como chaves em um dicionário. Você pode então armazenar informações sobre cada usuário usando um dicionário como o valor associado ao seu nome de usuário. No código a seguir, armazenamos três informações sobre cada usuário: seu primeiro nome, sobrenome e localização. Acessaremos essas informações percorrendo os nomes de usuário e o dicionário de informações associado a cada nome de usuário:
usuarios = {
'aeinstein': {
'nome': 'albert',
'sobrenome': 'einstein',
'local': 'princeton'
},
'mcurie': {
'nome': 'marie',
'sobrenome': 'curie',
'local': 'paris'
}
}
for nome_usuario, info_usuario in usuarios.items(): # 1
print(f'\nUsuário: {nome_usuario}') # 2
nome_completo = f'{info_usuario["nome"]} {info_usuario["sobrenome"]}' # 3
local = info_usuario['local']
print(f'\t- Nome completo: {nome_completo.title()}') # 4
print(f'\t- Localização: {local.title()}')
Primeiro, definimos um dicionário chamado usuarios com duas chaves: uma para cada nome de usuário 'aeinstein' e 'mcurie'. O valor associado a cada chave é um dicionário que inclui o primeiro nome, o sobrenome e a localização de cada usuário. Então, fazemos um loop pelo dicionário usuarios (1). O Python atribui cada chave à variável nome_usuario, e o dicionário associado a cada nome de usuário é atribuído à variável info_usuario. Uma vez dentro do loop do dicionário principal, imprimimos o nome de usuário (2).
Então, começamos a acessar o dicionário interno (3). A variável info_usuario, que contém o dicionário de informações do usuário, tem três chaves: 'nome', 'sobrenome' e 'local'. Usamos cada chave para gerar um nome completo e local bem formatados para cada pessoa e, então, imprimir um resumo do que sabemos sobre cada usuário (4).
Observe que a estrutura do dicionário de cada usuário é idêntica. Embora não seja necessária pelo Python, essa estrutura torna os dicionários aninhados mais fáceis de trabalhar. Se o dicionário de cada usuário tivesse chaves diferentes, o código dentro do loop for seria mais complicado.
Exercício 07: Comece com o programa que você escreveu para o exercício 1. Crie dois novos dicionários representando pessoas diferentes e armazene todos os três dicionários em uma lista chamada pessoas. Percorra sua lista de pessoas. Conforme você percorre a lista, imprima tudo o que sabe sobre cada pessoa.
Exercício 08: Crie vários dicionários, onde cada dicionário representa um animal de estimação diferente. Em cada dicionário, inclua o tipo de animal e o nome do dono. Armazene esses dicionários em uma lista chamada pets. Em seguida, faça um loop pela sua lista e, conforme você faz, imprima tudo o que você sabe sobre cada animal de estimação.
Exercício 09: Crie um dicionário chamado lugares_favoritos. Pense em três nomes para usar como chaves no dicionário e armazene de um a três lugares favoritos para cada pessoa. Percorra o dicionário e imprima o nome de cada pessoa e seus lugares favoritos.
Exercício 10: Modifique seu programa do exercício 2 para que cada pessoa possa ter mais de um número favorito. Em seguida, imprima o nome de cada pessoa junto com seus números favoritos.
Exercício 11: Crie um dicionário chamado cidades. Use os nomes de três cidades como chaves no seu dicionário. Crie um dicionário de informações sobre cada cidade e inclua o país em que a cidade está e sua população aproximada. As chaves para o dicionário de cada cidade devem ser algo como pais e populacao. Imprima o nome de cada cidade e todas as informações que você armazenou sobre ela.
Neste capítulo, você aprendeu como definir um dicionário e como trabalhar com as informações armazenadas em um dicionário. Você aprendeu como acessar e modificar elementos individuais em um dicionário e como fazer um loop por todas as informações em um dicionário. Você aprendeu a fazer um loop pelos pares de chave-valor de um dicionário, suas chaves e seus valores. Você também aprendeu como aninhar vários dicionários em uma lista, aninhar listas em um dicionário e aninhar um dicionário dentro de um dicionário.
No próximo capítulo, você aprenderá sobre loops while e como aceitar entrada de pessoas que estão usando seus programas. Este será um capítulo emocionante, porque você aprenderá a tornar todos os seus programas interativos: eles serão capazes de responder à entrada do usuário.