Modulo 012 – Dicionários em Python

 – Dicionários em Python
Já vimos até agora 2 formas de estruturar dados:
1) Listas – Usam [], são mutáveis;
2) Tuplas = Usam (), não são mutáveis;
Agora vamos conhecer uma das estruturas mais potentes. Os dicionários.
A estrutura desses dicionários são baseados em chaves (key) e valores (value).
Aqui, ao invés de usarmos a posição para acessar uma informação, vamos usar a CHAVE.
Outra característica que os dicionários não possuem é uma ordem padrão (nas versões mais antigas do Python)! Por isso não é recomendado pensarmos em posição ao usarmos dicionários.

 Listas são assim: lista = [item1,item2,item3
 Tuplas são assim: tupla = (item1,item2,item3

Estrutura:
dicionario = {chave: valor, chave: valor, chave: valor, chave: valor ...}

Vantagens e Desvantagens
• Não devem ser usados para pegar itens em uma determinada ordem.
• Podem ter valores heterogêneos (vários tipos de valores dentro de um mesmo dicionário: inteiros, strings, listas, etc)
• Chaves são únicas obrigatoriamente.
• Mais intuitivos de trabalhar.

Vamos entender melhor a estrutura e o que são as chaves e valores que falamos anteriormente. A estrutura sempre será chave : valor
No exemplo ao lado temos uma lista de produtos
mais vendidos por categoria.
• Todas as categorias (sublinhadas de amarelo) são Chaves (Keys);
• Todos os produtos são (sublinhados de verde) são Valores (values);
O Python sempre buscará um valor dado uma chave. Ex:
Dicionário produtos mais vendidos, chave livros? Resposta: o alquimista

 tecnologia:iphone 
 refrigeracao:ar consul 12000 btu 
 livros:o alquimista 
 eletrodomesticos:geladeira 
 lazer:prancha surf 

Vamos ver o mesmo exemplo, mas agora no Python! Usamos a mesma estrutura do slide anterior para descrever nos itens do dicionário. Atenção, que como se tratam de strings precisamos usar as aspas!
Criamos uma variável livro para receber o VALOR do dicionário mais_vendidos. Como a CHAVE fornecida foi ‘livros’, o valor atribuído é ’o alquimista’.

 mais_vendidos = {'tecnologia': 'iphone', 'refrigeracao': 'ar consul 12000 btu', 'livros': 'o alquimista', 'eletrodoméstico': 'geladeira', 'lazer': 'prancha surf'
 livro = mais_vendidos['livros'] 
 print(livro) 
_________________
 o alquimista 

– Pegar item Dicionário e Verificar Item Dicionário

Como vimos no exemplo anterior podemos buscar um VALOR usando NOMEDICIONARIO[‘CHAVE’]. Além dessa forma também temos um método chamado .GET(). Aqui vamos usar a mesma premissa anterior, só mudando o formato do código.

 mais_vendidos = {'tecnologia': 'iphone', 'refrigeracao': 'ar consul 12000 btu', 'livros': 'o alquimista', 'eletrodoméstico': 'geladeira', 'lazer': 'prancha surf'
 vendas_tecnologia = {'iphone': 15000, 'samsung galaxy': 12000, 'tv samsung': 10000, 'ps5': 14300, 'tablet': 1720, 'ipad': 1000, 'tv philco': 2500, 'notebook hp': 1000, 'notebook dell': 17000, 'notebook asus': 2450

 print(mais_vendidos['livros']) 
 print(mais_vendidos.get('livros')) 
__________________
 o alquimista 
 o alquimista 

O que aconteceria se procurássemos por uma chave que não existe?. Usando apenas chave ao procurar uma chave inexistente, o Python retorna um erro.
Já o método .GET retornará NONE como resultado. Ou seja, não existe nenhuma CHAVE ‘geladeiras’ no dicionário.

 print(mais_vendidos['livros']) 
__________________
 KeyError: 'geladeiras' 

 print(mais_vendidos.get('livros')) 
__________________
 None 

 A T E N Ç Ã O ! 
O fato do método GET não retornar erro não significa que seja melhor para todas as situações!

– Adicionar, Modificar e Remover Itens do Dicionário
Assim como as listas, também podemos atualizar dicionários, adicionando, modificando ou removendo itens. No exemplo ao lado, temos um dicionário vazio que vamos inserir dados de duas formas distintas.

 vendas_vendedores = {} 
                                      
 vendas_vendedores['João'] = 100 
 print(vendas_vendedores) 
                                         
 vendas_vendedores.update({'Lira': 50, 'Alon': 80}) 
 print(vendas_vendedores) 
___________________________
 {'João': 100} 
 {'João': 100, 'Lira': 50, 'Alon': 80} 

E quando inserimos uma CHAVE que já existe? Perceba que ao usarmos as mesma estrutura anterior e atualizamos os valores das CHAVES anteriores. Quando adicionamos novos valores em CHAVES EXISTENTES, SUBSTITUÍMOS os valores anteriores. Não há duplicidade nas chaves.

 vendas_vendedores = {} 
                                      
 vendas_vendedores['João'] = 70 
 print(vendas_vendedores) 
                                         
 vendas_vendedores.update({'Lira'67'Alon'12}) 
 print(vendas_vendedores) 
___________________________
 {'João': 70, 'Lira': 50, 'Alon': 80} 
 {'João': 70, 'Lira': 67, 'Alon': 12} 

Para remover um conjunto chave/valor de um dicionário, nós temos 3 formas distintas.
• DEL() – Exclui um conjunto chave/valor de um dicionário;
• .POP() – Apaga um conjunto chave/valor de um dicionário, mas armazena essa informação em outra variável;
• .CLEAR() – Apaga todos os dados de um dicionário.

 lucro_1tri = {'janeiro': 100000, 'fevereiro': 120000, 'março': 90000
 lucro_2tri = {'abril': 88000, 'maio': 89000, 'junho': 120000

 #Removendo o mês de junho do dicionário e armazenando em uma variável Lucro_jun: 
 del lucro_2tri['junho'
 print(lucro_2tri) 
_______________________________
 {'abril': 88000, 'maio': 89000} 

  #Removendo o conjunto chave valor de junho e atribuindo a variável Lucro_jun:  
 lucro_jun = lucro_2tri.pop('junho'
 print(lucro_2tri) 
 print(lucro_jun) 
_____________________
 {'abril': 88000, 'maio': 89000} 
 120000 

 #Removendo todos os dados de um dicionário: 
 lucro_2tri.clear() 
 print(lucro_2tri) 
___________________
 {} 

– For em Dicionários
Vamos entender como associar o FOR para fazer um unpacking dos conjuntos chave/valor. Usando o mesmo princípio que vimos anteriormente vamos criar uma variável chave que irá percorrer todo o dicionário vendas_tecnologia. Perceba que ao fazermos print(chave) não temos o conjunto chave/valor, apenas a chave.

 vendas_tecnologia = {'iphone': 15000, 'samsung galaxy': 12000, 'tv samsung': 10000, 'ps5': 14300, 'tablet': 1720, 'ipad': 1000, 'tv philco': 2500, 'notebook hp': 1000, 'notebook dell': 17000, 'notebook asus': 2450
                                
 #demonstrando o for 
 for chave in vendas_tecnologia: 
     print(chave) 
________________________
 iphone 
 samsung galaxy 
 tv samsung 
 ps5 
 tablet 
 ipad 
 tv philco 
 notebook hp 
 notebook dell 
 notebook asus 

Sabendo que conseguimos acessar o valor com uma chave específica, podemos usar a estrutura vendas_tecnologia[chave] a fim de termos o resultado esperado.

– Métodos Úteis Dicionários – items
Assim como as listas e tuplas os dicionários possuem alguns métodos que nos ajudam a tratar os dados de forma simples: Neste primeiro exemplo iremos usar o método .items().
Aqui ao invés de usarmos no for chave, vamos usar item. Perceba que o que temos de retornos não são apenas as chaves, mas todas as tuplas do dicionário com seus resultados chave/valor

 vendas_tecnologia = {'iphone'15000'samsung galaxy'12000'tv samsung'10000'ps5'14300'tablet'1720'ipad'1000'tv philco'2500'notebook hp'1000'notebook dell'17000'notebook asus'2450
                                
 for item in vendas_tecnologia.item(): 
     print(item) 
________________________
 ('iphone', 15000) 
 ('samsung galaxy', 12000) 
 ('tv samsung', 10000) 
 ('ps5', 14300) 
 ('tablet', 1720) 
 ('ipad', 1000) 
 ('tv philco', 2500) 
 ('notebook hp', 1000) 
 ('notebook dell', 17000) 
 ('notebook asus', 2450) 

Podemos aproveitar as tuplas para fazermos o unpacking como já vimos no módulo 11.
A diferença aqui é que não usamos item no for e sim 2 variáveis que descrevem melhor o que representam o conjunto chave/valor.

 vendas_tecnologia = {'iphone'15000'samsung galaxy'12000'tv samsung'10000'ps5'14300'tablet'1720'ipad'1000'tv philco'2500'notebook hp'1000'notebook dell'17000'notebook asus'2450
                                
 for produto,vendas in vendas_tecnologia.item(): 
     print('{}: {} de unidades.'.format(produto,vendas)) 
________________________
 iphone: 15000 de unidades. 
 samsung galaxy: 12000 de unidades. 
 tv samsung: 10000 de unidades. 
 ps5: 14300 de unidades. 
 tablet: 1720 de unidades. 
 ipad: 1000 de unidades. 
 tv philco: 2500 de unidades. 
 notebook hp: 1000 de unidades. 
 notebook dell: 17000 de unidades. 
 notebook asus: 2450 de unidades. 

– Métodos Úteis Dicionários – Keys and values

Mais 2 métodos de dicionários usualmente utilizados são:
• keys()
• values()

 vendas_tecnologia = {'iphone'15000'samsung galaxy'12000'tv samsung'10000'ps5'14300'tablet'1720'ipad'1000'tv philco'2500'notebook hp'1000'notebook dell'17000'notebook asus'2450
                                 
 print(vendas_tecnologia.keys()) 
 print(vendas_tecnologia.values()) 
________________________
 dict_keys(['iphone', 'samsung galaxy', 'tv samsung', 'ps5', 'tablet', 'ipad', 'tv philco', 'notebook hp', 'notebook dell', 'notebook asus']) 
 dict_values([15000, 12000, 10000, 14300, 1720, 1000, 2500, 1000, 17000, 2450)] 

 A T E N Ç Ã O ! 
O dict_keys ou o dict_values são listas um pouco das que vimos até agora. Elas são listas associadas diretamente ao
dicionário. Portanto, qualquer modificação no conjunto CHAVE/VALOR irá alterar a lista dict_keys ou dict_values.

– Zip e Transformando Listas em Dicionários
Até agora sempre trabalhamos com 2 listas que eram complementares entre sim porém não possuíam vínculo de estrutura. O que vamos ver agora é como transformar listas em dicionários. Isso é bastante útil, pois como sabemos o dicionário faz um link entre informações de chave e valor.
Nesse caso, as chaves são os itens da lista produtos e os valores, os itens da lista vendas. No entanto, para fazermos essa conversão precisamos transformar essas duas listas em uma lista de tuplas usando a função ZIP() conforme apresentado no print ao lado.

 produtos = ['iphone', 'samsung galaxy', 'tv samsung', 'ps5', 'tablet', 'ipad'
 vendas = [15000, 12000, 10000, 14300, 1720, 1000
                               
 lista_tuplas = zip(produtos, vendas) 
 print(lista_tuplas) 
______________________
 <zip object at 0x00000203DBF30E00> 

Função ZIP criará um objeto por isso ao “printarmos” lista_tuplas não temos a lista e sim o código desse objeto

Como vimos, printar a lista_tuplas não nos trouxe o resultado esperado. Para podermos acessar os itens dessa lista vamos usar um conhecimento que já vimos: o unpacking. Usando o for vamos printar todos os itens da lista_tuplas. Perceba que o resultado são tuplas!

 produtos = ['iphone''samsung galaxy''tv samsung''ps5''tablet''ipad'
 vendas = [1500012000100001430017201000
                               
 lista_tuplas = zip(produtos, vendas) 
 print(lista_tuplas) 
 for item in lista_tuplas:
     print(item) 
______________________
 <zip object at 0x00000203DBF30E00> 
 ('iphone', 15000) 
 ('samsung galaxy', 12000) 
 ('tv samsung', 10000) 
 ('ps5', 14300) 
 ('tablet', 1720) 
 ('ipad', 1000) 

Agora, nos falta criarmos o dicionário a partir da nossa lista de tuplas. Para isso, vamos usar a função dict(). Veja que agora a lista e produtos e vendas foram agora agrupadas em dicionário_vendas.

 produtos = ['iphone''samsung galaxy''tv samsung''ps5''tablet''ipad'
 vendas = [1500012000100001430017201000
                               
 lista_tuplas = zip(produtos, vendas) 
 dicionario_vendas = dict(lista_tuplas) 
 print(dicionario_vendas) 
______________________
 {'iphone': 15000, 'samsung galaxy': 12000, 'tv samsung': 10000, 'ps5': 14300, 'tablet': 1720, 'ipad': 1000} 

 A T E N Ç Ã O ! 
As listas, produtos e vendas não deixaram de existir!! Apenas foi criado um dicionário ‘dicionário_vendas’ a partir dessas listas

Nenhum comentário:

Postar um comentário