Enviar um café pro programador

Mostrando postagens com marcador Dicionário. Mostrar todas as postagens
Mostrando postagens com marcador Dicionário. Mostrar todas as postagens

Como Copiar um Dicionário ou Lista

Neste tutorial de nosso Curso de Python com certificado, vamos aprender duas maneiras diferentes de copiar um dicionário: uma rasa (shallow) e outra profunda (deep).

Veja antes:


Cópia rasa (shallow copy)

Você foi contratado por uma grande empresa multinacional para programar e gerenciar o sistema dela.

Em um dicionário, você salvou os dados de login e senha de alguns funcionários, com nome login:
login={'joao'   : 'senha',
       'maria'  : '123456',
       'zezinho': 'restart'}

Por exemplo, o login 'joao' tem senha 'senha'. Já a senha de 'maria' é '123456' e a senha do 'zezinho' é 'restart'.

Como você é um bom programador, afinal estudou pelo Curso Python Progressivo, decidiu criar um backup e salvar esses dados.

Criou a variável backup e salvou uma cópia do dicionário login.
backup = login

Pronto, agora o dicionário backup tem uma cópia dos dados de login da empresa.

Porém, a galera descobriu que a senha do zezinho é 'restart' e ficou zoando ele.
Ele pediu pra você mudar a senha dele para 'ironmaiden'.

Você fez o seguinte:
login['zezinho'] = 'ironmaiden'

Pronto, senha do zezinho foi mudada.

Agora vamos imprimir o dicionário login (com a alteração) e a cópia antiga, o backup (antes da cópia):

Olha só!
Você alterou o dicionário login, mas o dicionário backup também foi alterado!
Por que isso aconteceu ?


Referência e Cópia rasa

Quando definimos a variável login e criamos nosso dicionário, reservamos um espaço na memória do computador.

Quando fazemos: backup = login

Estamos criando a variável backup, porém ela não é um dicionário, ela vai simplesmente armazenar uma referência para a variável login (essa sim é um espaço na memória com um dicionário lá).

Ou seja, a variável backup tem um endereço de memória (referência), que aponta pro local de memória de login.

Por isso, quando alteramos login, automaticamente alteramos backup, pois backup aponta para aquele endereço de memória de login, que alteramos!!!

Ou seja, não fizemos uma cópia de verdade, fizemos uma cópia rasa.
Vamos aprender como fazer uma cópia de verdade.



Cópia profunda (deep copy): copy.deepcopy()

Primeiro, importamos o módulo copy
import copy 

E pronto! Aí sim criamos uma cópia de verdade.
Agora, a variável backup aponta para um endereço de memória diferente do endereço de memória onde está a variável login.

Nesse novo endereço, tem um outro dicionário diferente, um novo.
É uma cópia profunda (do inglês, deep).

import copy 
login={'joao'   : 'senha',
       'maria'  : '123456',
       'zezinho': 'restart'}

backup = copy.deepcopy(login)

print(backup)

login['zezinho'] = 'ironmaiden'

print(login)
print(backup)

Ou seja, cuidado ao passar listas e dicionários por referência!
As vezes queremos passar a referência e as vezes uma cópia (profunda), cuidado, moçada!

Contar Ocorrências de Cada Caractere em uma String (Tutorial de Python)

Neste tutorial simples e curto de Python, vamos te mostrar como pegar uma string e contar a ocorrência (quantas vezes aparece) cada um dos caracteres.

Contar Caracteres com Dicionário

Relembrando o método setdefault( key, value), ele pega uma chave (key) e verifica se está na sequência, se estiver atribui para ela o valor value, senão estiver, retornar esse value.

No nosso código, inicialmente definimos nossa string, a texto.
Depois, um dicionário chamado contador{}, onde cada caractere diferente de texto será uma chave e seus valores serão o número de ocorrências.

Fazemos um laço FOR iterar toda a string, caractere por caractere.
Cada caractere, um por vez, fica armazenado na variável temporária char.

Usamos o método setdefault para verificar se char está presente na string. E é óbvio que sempre vai estar, pois estamos iterando a string e colocamos um valor qualquer padrão inicial de 0 (ou seja, cada caractere, na primeira vez que aparece, é criado um par chave-valor onde a chave é o caractere e o valor inicial é 0, pois estamos começando a contar).

Então, depois, adicionamos +1 para cada loop do laço FOR.
Pode ser um pouco complicado entender de início, mas tente ler novamente e depois ver o código.

O método pprint, do módulo pprint, serve pra imprimir o dicionário de uma maneira bonitinha e organizada.


Código Python:



import pprint

texto = 'Curso Python Progressivo'
contador = {}

for char in texto:
    contador.setdefault(char, 0)
    contador[char] += 1
    
pprint.pprint(contador)


Com Exibir Items, Chave e Valores de um Dicionário em Python

Neste tutorial de nosso Curso de Python Online, vamos ver novamente como criar um dicionário e agora vamos aprender como exibir, de várias m

Leia também:

Como Exibir Dicionários


No tutorial anterior, aprendemos: O que é um Dicionário, como funciona e para que serve.

Vamos usar o exemplo dos alunos e das notas, onde temos um dicionário com três pares chave-valor, com nomes e notas dos alunos:

notas={'joao'   :  9,
       'maria'  : 10,
       'zezinho': 4}

print("Nota de João: ",notas['joao'])
print("Nota de Maria: ",notas['maria'])
print("Nota de José: ",notas['zezinho'])

Para exibir todos os items de um dicionário em Python, podemos usar três métodos (que são funções que já vem junto com o dicionário):
  1. Método items(): exibe todos os itens, ou seja, os pares chave-valor
  2. Método keys(): exibe todas as chaves de um dicionário
  3. Método values(): exibe todos os valores de um dicionário


Como exibir os items: Método items()

Se o nome de nosso dicionário é notas, para usar o método items, basta fazermos:
  • notas.items()
Colocamos esse código dentro de um print.
  • Código Python:

notas={'joao'   :  9,
       'maria'  : 10,
       'zezinho': 4}

print( notas.items() )
  • Resultado:
Como usar dicionários em Python

Ou seja, apareceu:
dict_items([('joao', 9), ('maria', 10), ('zezinho', 4)])



Com exibir chaves de um dicionário: Método keys()

Para exibirmos as chaves de um dicionário cuja variável se chama notas, usamos o método keys:
notas.keys()
  • Código Python:
notas={'joao'   :  9,
       'maria'  : 10,
       'zezinho': 4}

print("Exibindo chaves:")
print( notas.keys() )
  • Resultado:
Curso de Python online

Apareceu:
dict_keys(['joao', 'maria', 'zezinho'])

Como exibir valores de um dicionário: Método values()

Por fim, para exibirmos os valores de um dicionário notas, basta usarmos o método values:
notas.values()
  • Código Python:
notas={'joao'   :  9,
       'maria'  : 10,
       'zezinho': 4}

print("Exibindo valores:")
print( notas.values() )
  • Resultado:
Curso de Python online grátis

O resultado é:
dict_values([9, 10, 4])

Exibindo Corretamente um Dicionário

Ok, aprendemos os métodos para exibir separadamente os itens, os valores e as chaves.
Mas va lá, ficou feio.

Negócio de dict_values e dict_values, está estranho.
O melhor seria aparecer algo do tipo:

Como exibir dicionários em Python, curso online com certificado

O grande segredo está nas chaves.
Vamos pegar o método keys() e usar a lista que ela retorna num laço for, veja a maneira mais indicada para exibir de uma maneira mais formatada um dicionário:

notas={'João'   :  9,
       'Maria'  : 10,
       'José': 4}

for nome in notas.keys():
    print(nome," tirou nota: ", notas[nome])

O que fizemos foi pegar cada chave, na variável nome e usar ela pra acessar os valores corretos do dicionário.

Dicionários em Python - O que é, Como usar e Para que serve

Neste tutorial de nosso Curso de Python, vamos falar do último tipo de dado de sequência: os dicionários.

Leia também:

Dicionário - O que é ?


Esse tipo de dado é, sem dúvida, o mais poderoso e flexível, dentre as sequências.

Nas listas e tuplas, tínhamos uma coisa em comum: os items eram ordenados, começavam no índice 0, e iam de um em um. Ou seja, são tipos de dados ordenados.

Já os dicionários são do tipo desordenados, pois não são numerados por índice.
Ao invés de índice, temos chaves.

E que chaves são essas? O que você quiser.
As chaves são índices também, mas pode ser qualquer número que você quiser ou uma string, por exemplo.

Eles não estão armazenados de uma maneira lógica e sequencial, estão propositalmente 'espalhados'.




Dicionário - Como declarar e Usar

Vamos definir um dicionário chamado meuCachorro.
Se nas listas usamos colchetes [ ], nas tuplas usamos parêntesis ( ), nos dicionários iremos usar chaves { }, veja:

meuCachorro={ 'raca': 'bulldog', 'idade' : 3, 'nome' : 'Florisbull'}

As chaves são: 'raca', 'idade' e 'nome'.
Elas tem os valores: 'bulldog', 3 e 'Florisbull', respectivamente.

Dicionário de uma maneira mais organizada:

meuCachorro={ 'raca': 'bulldog',
              'idade' : 3,
              'nome' : 'Florisbull'}

Assim, a raça do cachorro está armazenada em: meuCachorro['raca']
Já a idade dele está armazenada em: meuCachorro['idade']
E  o nome em: meuCachorro['nome']

Ou seja, os items de um dicionário sempre vem aos pares: chave e valor, separados por :


Exemplo de uso de Dicionário em Python

No código abaixo, criamos um dicionário de nome notas, onde temos:
  1. três chaves: joao, maria, zezinho
  2. três valores: 9, 10 e 4. 

Ou seja, as chaves são os nomes e os valores, as notas.

A seguir, damos três prints para mostrar os nomes e notas:

notas={'joao'   :  9,
       'maria'  : 10,
       'zezinho': 4}

print("Nota de João: ",notas['joao'])
print("Nota de Maria: ",notas['maria'])
print("Nota de José: ",notas['zezinho'])


Ou podemos fazer usando um laço FOR, onde a variável aluno vai receber o valor de cada chave, em sequência, do dicionário:

notas={'joao'   :  9,
       'maria'  : 10,
       'zezinho': 4}

for aluno in notas:
    print("Nota de ", aluno, ": ",notas[aluno])

Nota a maneira como declaramos e inicializamos o dicionário, cada linha um par chave-valor.
Porém, isso não é obrigatório, poderíamos fazer assim:
  • notas={'joao':9,'maria':10,'zezinho':4}

Mas assim é mais organizado e bonitinho:
notas={'joao'   :  9,
       'maria'  : 10,
       'zezinho': 4}

Não concorda?



Exercício de Dicionário

No dicionário abaixo, temos os dados de acesso de 3 usuários, cada um com seu login e senha, onde o login é a chave e a senha o valor.

Faça um script que peça ao usuário seu login e senha, se tiver certo envie uma mensagem de acesso autorizado, se fornecer a senha errada, informe o erro.

loginSenha={'joao'   : 'rush', 'maria'  : 'yes', 'zezinho': 'genesis'}


  • Código Python:

Usaremos a variável login para armazenar o valor de uma chave do dicionário (pode ser joao, maria ou zezinho), em seguida vamos ver se o valor contigo em loginSenha[login] é o mesmo da senha que o usuário digitou.


loginSenha={'joao'   : 'rush',
            'maria'  : 'yes',
            'zezinho': 'genesis'}

login=input("Qual seu login: ")
senha=input("Senha: ")

if loginSenha[login] == senha:
    print("Acesso autorizado...")
else:
    print("Senha errada")


Note que se digitar 'joao' para login e digitar outra senha, como 'yes', vai dar erro.
Cada chave tem apenas um valor associado, são os pares chave-valor.


Dicionário - Para que serve

Assim como as listas, os dicionários são mutáveis, ou seja, podemos inserir, retirar e mudar seus items. Não é permitido, diretamente, apagar uma chave (fazemos algumas coisas, como criar um outro item e apagar um item antigo, mas só a chave diretamente, não se muda).

Não existe ordem, começo ou fim em um dicionário.
Por isso dizemos que são usados para mapeamento, pois mapeiam sua chave com seu valor.

Ou seja, acessamos os items de um dicionário através de suas chaves.
É como se o valor só fosse aberto por uma determinada chave, como um cofre.

Já o fato dele ser desorganizado não implica que ele seja 'bagunçado' ou mais lento. Aliás, o 'embaralhamento' dos items pode até ajudar o computador a achar determinada informação de maneira mais eficiente.

Embora seja comum usar strings como chaves (nomes de pessoas, logins, dados etc), ela pode ser qualquer objeto imutável (não pode listas)./