Dicionários em Python - #12

jcarlosvale

Joao Carlos Sousa do Vale

Posted on July 12, 2022

Dicionários em Python - #12

Introdução

Dicionários são coleções de objetos semelhantes às listas e tuplas. A principal diferença é que os dicionários armazenam uma “chave” para cada “valor”, desta forma, no jargão computacional os dicionários são mapas em Python.

Parece confuso, mas vamos explorar este conceito nas próximas seções.

Sintaxe

Dicionários ou mapas armazenam dois valores por cada elemento: uma chave e um valor. É uma estrutura de dados cuja principal finalidade é localizar elementos de forma rápida.

Utilizamos um mapa porque dada uma chave, você encontra um valor. Não existem chaves repetidas em um mapa.

Um dicionário é criado com o uso de chaves (“{ }”) e cada par chave, valor é identificado por dois pontos (“:”) e separados por vírgula (“,”).

#Sintaxe - criando dicionários
>>> mapa_cores = {"Joao":"preto", "Lara":"rosa", "Jose":"azul"}
>>> print(mapa_cores)
{'Joao': 'preto', 'Lara': 'rosa', 'Jose': 'azul'}

>>> mapa_cores_2 = {"Joao":"preto", "Lara":"rosa", "Joao":"azul"}
>>> print(mapa_cores_2)
{'Joao': 'azul', 'Lara': 'rosa'}
Enter fullscreen mode Exit fullscreen mode

No mapa_cores_2 do exemplo anterior, usamos a mesma chave ‘Joao’ duas vezes, com os valores “preto” e “azul” respectivamente. Como as chaves não podem se repetir em um dicionário, o último valor prevalece, e o resultado é o par “Joao”:“azul”.

Também podemos usar dicionários para representar informações de algo em particular, por exemplo, um aluno.

#Sintaxe - representando informações específicas
>>> aluno = {"nome":"Lara", "sexo":"feminino", "idade":15, "altura":1.65}

>>> print(aluno)
{'nome': 'Lara', 'sexo': 'feminino', 'idade': 15, 'altura': 1.65}
Enter fullscreen mode Exit fullscreen mode

Manipulando valores

Enquanto as listas utilizam um índice baseado na posição do elemento (índices começando na posição ZERO), os dicionários usam as chaves como índices.

Acessando valores com a chave

Se queremos ler um valor, devemos usar o valor da chave. Também é possível atualizar o valor, utilizando a chave como índice.

#Manipulando valores em um dicionário
>>> mapa_cores = {"Joao":"preto", "Lara":"rosa", "Jose":"azul"}
>>> print(mapa_cores)
{'Joao': 'preto', 'Lara': 'rosa', 'Jose': 'azul'}
>>> print(mapa_cores['Lara'])
rosa

>>> aluno = {"nome":"Lara", "sexo":"feminino", "idade":15, "altura":1.65}
>>> print("Idade da aluna %s = %s" % (aluno["nome"], aluno["idade"]))
Idade da aluna Lara = 15
Enter fullscreen mode Exit fullscreen mode

Acessando valores - get()

Outra forma de acessar os valores de um dicionário é através do método get().

#Sintaxe - get()
<mapa>.get(<nome_chave>, <retorno_padrao>)
Enter fullscreen mode Exit fullscreen mode

Usando o get() se a chave não existir no mapa, será retornado um valor padrão definido pelo programador.

#Usando o get()
>>> mapa_cores = {'Joao': 'preto', 'Lara': 'rosa'}
>>> mapa_cores.get('Joao', 'azul')
'preto'
>>> mapa_cores.get('Jose', 'azul')
'azul'
>>> print(mapa_cores.get('Jose'))
None
Enter fullscreen mode Exit fullscreen mode

A chave ‘Jose’ não existe no mapa, então é retornado o valor ‘azul’. Caso você não forneça um valor padrão, será retornado o valor None.

Inserindo valores com a chave

Inserir valores em dicionários é mais simples do que em listas. Basta utilizar o dicionário e atribuir um novo valor para uma nova chave.

#Inserindo valores em um dicionário
>>> mapa_cores = {"Joao":"preto", "Lara":"rosa", "Jose":"azul"}
>>> print(mapa_cores)
{'Joao': 'preto', 'Lara': 'rosa', 'Jose': 'azul'}

>>> mapa_cores['Raul'] = 'vermelho'
>>> print(mapa_cores)
{'Joao': 'preto', 'Lara': 'rosa', 'Jose': 'azul', 'Raul': 'vermelho'}

>>> aluno = {"nome":"Lara", "idade":15}
>>> print(aluno)
{'nome': 'Lara', 'idade': 15}

>>> aluno["signo"] = "cancer"
>>> print(aluno)
{'nome': 'Lara', 'idade': 15, 'signo': 'cancer'}
Enter fullscreen mode Exit fullscreen mode

Inserindo valores - setdefault()

O método setdefault() permite adicionar um valor padrão quando uma chave não existe no dicionário.

#Inserindo valores em um dicionário com setdefault()
>>> aluno = {"nome":"Lara"}
>>> aluno
{'nome': 'Lara'}

>>> aluno.setdefault("idade", 15)
15
>>> aluno
{'nome': 'Lara', 'idade': 15}

>>> aluno.setdefault("idade", 20)
15
>>> aluno
{'nome': 'Lara', 'idade': 15}
Enter fullscreen mode Exit fullscreen mode

Observe que ao executarmos o setdefault() mais de uma vez, o valor não será mais alterado porque a chave já existe.

Removendo valores - del

O comando del também é utilizado para remover a chave e valor.

#Removendo valores em um dicionário
>>> mapa_cores = {"Joao":"preto", "Lara":"rosa", "Jose":"azul"}
>>> print(mapa_cores)
{'Joao': 'preto', 'Lara': 'rosa', 'Jose': 'azul'}

>>> del mapa_cores['Joao']

>>> print(mapa_cores)
{'Lara': 'rosa', 'Jose': 'azul'}
Enter fullscreen mode Exit fullscreen mode

Percorrendo dicionários

Lendo com items()

Utilizando um laço for podemos ler a chave e o valor de um mapa, invocando o método items().

#Sintaxe - usando for para ler dicionários
for <variavel_key>, <variavel_value> in <mapa>.items():
Enter fullscreen mode Exit fullscreen mode
#Programa - lerMapa.py
usuario = {
    'nome':'Maria',
    'idade':38,
    'sexo':'F'
}

for key, value in usuario.items():
    print(f"\nChave: {key}")
    print(f"Valor: {value}")
Enter fullscreen mode Exit fullscreen mode

Nas linhas 01 a 05 criamos um mapa com 3 chaves: nome, idade, sexo. E usando a sintaxe for da linha 07 imprimimos as chaves e valores.

#Execução - usando for para ler dicionários
Chave: nome
Valor: Maria

Chave: idade
Valor: 38

Chave: sexo
Valor: F
Enter fullscreen mode Exit fullscreen mode

Um algoritmo interessante usando o setdefault() e o for é o de contar os caracteres de uma string.

Implemente no seu ambiente.

#texto = input("Digite um texto: ")
count = {}
for letra in texto:
    count.setdefault(letra, 0)
    count[letra] += 1

print(count)
Enter fullscreen mode Exit fullscreen mode

Você consegue entender o código acima? O método setdefault() é utilizado para criar um valor padrão na contagem de uma letra encontrada, caso não exista no dicionário, igual a ZERO. Desta forma, podemos manipular o campo (linha 05), incrementando o valor daquela chave. Se não tivéssemos usado o método para indicar um valor padrão, o código acima geraria um erro, uma vez que a chave não estaria presente no dicionário.

#Execução - countChar.py
Digite um texto: abacaxi
{'a': 3, 'b': 1, 'c': 1, 'x': 1, 'i': 1}
Enter fullscreen mode Exit fullscreen mode

Lendo com keys()

O método keys() retorna a lista de chaves de um dicionário.

#Programa - usarKeys.py
usuario = {
    'nome':'Maria',
    'idade':38,
    'sexo':'F'
}

print("Usando Keys())")
for key in usuario.keys():
    print(f"Chave: {key}")

print("\nSem usar Keys())")
for key in usuario:
    print(f"Chave: {key}")
Enter fullscreen mode Exit fullscreen mode

Na linha 12 do código anterior, é possível navegar usando somente o nome do dicionário.

#Execução - usarKeys.py
Usando Keys())
Chave: nome
Chave: idade
Chave: sexo

Sem usar Keys())
Chave: nome
Chave: idade
Chave: sexo
Enter fullscreen mode Exit fullscreen mode

Lendo com values()

O método values() retorna a lista de valores de um mapa.

#Programa - usarValues.py
cores = {
    'Jose':'preto',
    'Leo':'branco',
    'Edu': 'amarelo'
}

for cor in cores.values():
    print(f"Cor: {cor}")
Enter fullscreen mode Exit fullscreen mode
#Execução - usarValues.py
Cor: preto
Cor: branco
Cor: amarelo
Enter fullscreen mode Exit fullscreen mode

Utilizando listas e dicionários

Listas, tuplas e dicionários são tipos de dados semelhantes aos numéricos, booleanos e strings. Desta forma podemos criar listas de dicionários, dicionários de listas, e outras variações.

Lista de dicionário

Neste exemplo, vamos criar uma lista de dicionários, representando uma turma escolar, e cada dicionário representando um aluno. Cada aluno possui uma média, e este programa irá indicar se o aluno reprovou (média < 4), ficará de recuperação (média < 7) ou se ele foi aprovado (médica >= 7).

#Programa - alunosAprovados.py
turma = [
    {'nome':'Paulo', 'media':5.5},
    {'nome':'Lara', 'media':8.5},
    {'nome':'Joca', 'media':3.2},
    {'nome':'Ze', 'media':7.0},
    {'nome':'Edu', 'media':2.4}
]

for aluno in turma:
    if aluno['media'] < 4.0:
        print(f"Aluno {aluno['nome']}: REPROVADO")
    elif aluno['media'] < 7.0:
        print(f"Aluno {aluno['nome']}: RECUPERACAO")
    else:
        print(f"Aluno {aluno['nome']}: APROVADO")
Enter fullscreen mode Exit fullscreen mode
#Execução - usarValues.py
Aluno Paulo: RECUPERACAO
Aluno Lara: APROVADO
Aluno Joca: REPROVADO
Aluno Ze: APROVADO
Aluno Edu: REPROVADO
Enter fullscreen mode Exit fullscreen mode

Podemos também implementar um dicionário de lista para salvar as notas de um aluno e calcular sua média.

#Programa - mediaAluno.py
aluno_01 = {
    "nome" : "Joel",
    "notas": [7.7, 10, 8.3]
}
aluno_02 = {
    "nome" : "Coringa",
    "notas": [3.2, 8, 4.0]
}
aluno_03 = {
    "nome" : "Batman",
    "notas": [8, 9, 10]
}

turma = [aluno_01, aluno_02, aluno_03]

#calcular media
for aluno in turma:
    notas = aluno["notas"]
    media = sum(notas) / len(notas)
    aluno["media"] = media

#imprimindo turma com media
print(turma)
Enter fullscreen mode Exit fullscreen mode

Nas linhas 01 a 12 é criado 3 variáveis do tipo dicionário, representando 3 alunos, com nome e uma lista de notas.

Na linha 14 criamos uma turma como uma lista de alunos.

O laço for lê cada aluno na turma, e utilizando a variável aluno, calcula a sua média (somando as notas e dividindo pela quantidade de notas) e salvando no dicionário representado por aluno.

Finalmente, podemos implementar o exemplo dos alunos aprovados com a turma sendo representada como dicionário de dicionários.

#Programa - alunosAprovadosUsandoDicionario.py
turma = {
    'Paulo' : {'nome':'Paulo', 'media':5.5},
    'Lara' : {'nome':'Lara', 'media':8.5},
    'Joca' : {'nome':'Joca', 'media':3.2},
    'Ze' : {'nome':'Ze', 'media':7.0},
    'Edu' : {'nome':'Edu', 'media':2.4}
}

for nome, dados in turma.items():
    if dados['media'] < 4.0:
        print(f"Aluno {nome}: REPROVADO")
    elif dados['media'] < 7.0:
        print(f"Aluno {nome}: RECUPERACAO")
    else:
        print(f"Aluno {nome}: APROVADO")
Enter fullscreen mode Exit fullscreen mode
#Execução - alunosAprovadosUsandoDicionario.py
Aluno Paulo: RECUPERACAO
Aluno Lara: APROVADO
Aluno Joca: REPROVADO
Aluno Ze: APROVADO
Aluno Edu: REPROVADO
Enter fullscreen mode Exit fullscreen mode

Erros comuns

Dicionários são estruturas chave-valor, não podemos usar chaves inexistentes na lógica de nossos programas.

#Usando chaves inexistentes geram erros na execução
>>> mapa_cores = {"Joao":"preto", "Lara":"rosa"}

>>> print(mapa_cores['Zezinho'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Zezinho'

>>> del mapa_cores['Raul']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Raul'
Enter fullscreen mode Exit fullscreen mode

Também não é possível fazer a junção (“+”) com dicionários.

#operação de junção não suportada
>>> mapa_cor_um = {"Joao":"preto"}
>>> mapa_cor_dois = {"Lara":"rosa"}

>>> mapa_cor_um + mapa_cor_dois
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
Enter fullscreen mode Exit fullscreen mode
💖 💪 🙅 🚩
jcarlosvale
Joao Carlos Sousa do Vale

Posted on July 12, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related