Dicionários em Python : Chave e valor(es)
- #Python
INTRODUÇÃO
Imagine um conjunto de estudantes de uma universidade que oferta diversas graduações em cursos de Tecnologia de Informação e Comunicação, esses estudantes possuem diversos dados pessoais e também estudantis que a instituição utiliza para realizar diversas funções administrativas, para identificá-los, o nome, embora possua forte consenso social, não pode ser usado de modo direto, pois há nomes repetidos nas graduações, deste modo, a instituição utiliza a matrícula ou dados de documentos pessoais como RG ou CPF para identificá-los, uma espécie de chave que identifica diversos valores. Este conceito assemelha-se aos dicionários da linguagem Python, pois há uma associação entre chaves e valores. Exploremo-nos mais como essa estrutura é bastante versátil e eficiente.
OS DICIONÁRIOS
Um dicionário associa chaves a valores e cada chave (única e imutável em instância) mapeia valores específicos, múltiplas chaves podem conter o mesmo valor, por exemplo, um dicionário contendo dados sobre a agricultura de um estado brasileiro por meio de um código estadual (chave) pode ter as mesmas quantidades de toneladas colhidas de leguminosas em dois ou mais estados distintos, ou um dicionário de um hospital pode armazenar dados de seus pacientes, cada um com seu identificador primário (chave) e vários pacientes podem ter apresentado valores iguais de pressão arterial em determinada instância que ficou mapeada naquele dicionário.
Criar um dicionário em Python é uma tarefa simples, afinal, sua sintaxe exige apenas chaves { } e colchetes [ ] em casos de uma lista de valores associada àquela chave , a título de exemplo:
#Para imprimir somente as chaves
estados = {'CE' : 'Ceará', 'AM' : 'Amazonas', 'GO' : 'Goiás', 'PR' : 'Paraná'}
for chaves in estados:
print(chaves)
#Para imprimir somente os valores
estados = {'CE' : 'Ceará', 'AM' : 'Amazonas', 'GO' : 'Goiás', 'PR' : 'Paraná'}
for valores in estados.values():
print(valores)
#Para imprimir somente tanto as chaves quanto seus valores específicos
estados = {'CE' : 'Ceará', 'AM' : 'Amazonas', 'GO' : 'Goiás', 'PR' : 'Paraná'}
for chaves, valores in estados.items():
print(chaves, "-", valores)
No exemplo com os estados brasileiros, a sigla de cada estado representa a chave única que identifica o nome daquele estado, logicamente que os valores poderiam ser mais numerosos, tendo também o nome da capital, extensão territorial, população, o Produto Interno Bruto(PIB), população da capital, quantidade média de desenvolvedores Python por quilômetro quadrado, por que não?
Descontrações à parte, vejamos mais um caso de uso dos dicionários:
#Considerando apenas o conjunto dos números naturais para todos os casos, será que o número 100 possui a mesma quantidade de múltiplos do número 3 que vão até 24?
matematica = {
'pares' : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20],
'ímpares' : [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21],
'primos' : [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37],
'multiplos_3' : [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30],
'divisores_100' : [1, 2, 4, 5, 10, 20, 25, 50, 100]
}
primeiros_nove = matematica['multiplos_3'][:9]
if (len(matematica['divisores_100']) == len(primeiros_nove)):
print("Você sabia que a quantidade de divisores de 100 é igual aos primeiros múltiplos do número 3 até o limite do número 24.")
else:
print("A comparação matemática não retornou resultados de alegações positivas.")
No exemplo acima, há chaves descritivas sobre subconjuntos específicos dos números naturais, tal como a teoria dos conjuntos da matemática fundamental permite operações como união e interseção de conjuntos por meio de seus valores, semelhantemente este dicionário permite comparações entre seus valores sejam eles analisados por esquema sejam por instância, o nome atribuído a cada chave exerce a função de identificação.
A ÓPERA DE DICIONÁRIOS E ORIENTAÇÃO A OBJETOS
Imaginemos uma ópera que realizará um grande concerto em breve a fim de apresentar canções instrumentais clássicas dos períodos clássico, romântico e barroco da música instrumental, para tanto um maestro decide organizar as canções que agradarão os ouvidos da plateia exausta pelos sons cansativos da vida contemporânea e, para tanto, esse maestro, também amante do raciocínio lógico, do paradigma dos objetos e da boa identificação dos elementos culturais que o permeiam, cria um programa em Python com classes, objetos, atributos, métodos e por fim um dicionário com uso da função auxiliar sorted() que retorna todos os elementos do dicionário de modo ordenado, já que o maestro também é muito perfeccionista:
#O programa Python orientado a objetos de nosso maestro
class Musico:
def __init__(self, nome, musicas):
self.nome = nome
self.musicas = musicas
class CatalogoMusical:
def __init__(self):
self.musicos = {}
def adicionar_musico(self, musico):
self.musicos[musico.nome] = musico.musicas
mozart = Musico('Mozart', ["Eine Kleine Nachtmusik", "Rondo Alla Turca"])
beethoven = Musico('Beethoven', ["Für Elise", "Virus"])
vivaldi = Musico('Vivaldi', ['Spring', 'Winter', 'Summer', 'Autumn'])
bach = Musico('Sebastian Bach', ['Tocatta and Fügue', 'Cello Suites'])
catalogo = CatalogoMusical()
catalogo.adicionar_musico(mozart)
catalogo.adicionar_musico(beethoven)
catalogo.adicionar_musico(vivaldi)
catalogo.adicionar_musico(bach)
for chaves, valores in sorted(catalogo.musicos.items()):
print(f"{chaves} - {', '.join(valores)}") #Há uma notação para remover os colchetes
No exemplo acima, a classe Músico tem como atributos o nome do músico e a(s) música(s) associada(s) a ele, deste modo, o método funcional para adicionar músico na classe CatalogoMusical realiza a inserção dos dados com a estrutura de dados do dicionário Python.
NÚMEROS, PARADIGMA FUNCIONAL E DICIONÁRIOS
Vamos imaginar agora que desejamos mapear os dez primeiros números inteiros para os seus equivalentes romanos e utilizamos uma função pura, um conceito de programação funcional que se utiliza de implementações de funções que sempre retornam os mesmos resultados, para filtrar somente os números romanos que possuem os equivalentes inteiros que são pares:
def filtrar_numeros_pares(d):
return {numero: romano for numero, romano in d.items() if numero % 2 == 0}
# Dicionário original com números inteiros e seus equivalentes romanos
numeros_romanos = {
1: 'I',
2: 'II',
3: 'III',
4: 'IV',
5: 'V',
6: 'VI',
7: 'VII',
8: 'VIII',
9: 'IX',
10: 'X'
}
numeros_pares_romanos = filtrar_numeros_pares(numeros_romanos)
print("Dicionário original:\n")
for inteiro, romano in numeros_romanos.items():
print(inteiro, "-", romano)
print("Números pares com equivalentes romanos:\n")
for inteiro, romano in numeros_pares_romanos.items():
print(inteiro, "-", romano)
No exemplo dado, a função pura filtra somente os números pares de acordo com a chave fornecida e, então, há a impressão dos dados originais e dos dados filtrados pela função pura.
LINGUAGEM DINÂMICA E EXCEÇÕES
Se for atribuído um valor que está associado a uma determinada chave, o valor antigo associado será esquecido e tentar atribuir um valor a uma chave inexistente, o interpretador retornará erro, e, claro, também é possível remover um dado associado de um dicionário por meio da função del, com as alegações extraídas da documentação oficial do Python 3 : " As principais operações em um dicionário são armazenar um valor com alguma chave e extrair o valor dado a chave. Também é possível deletar um par chave : valor com del. Se você armazenar usando uma chave que já está em uso, o valor antigo associado a essa chave é esquecido. É um erro extrair um valor usando uma chave que não existe." (Traduzido do inglês).
Referências bibliográficas:
Intro to Python for Computer Science and Data Science
Autores: Paul Deitel, Harvey Deitel
Documentação oficial do Python : https://docs.python.org/3/contents.html