Introdução à programação e aos algoritmos
5.12 Dicionários
Figura 5.12 Problema na criação de lista de listas.
A operação [0]*col retorna uma referência a uma lista de col
elementos zero. Quando é executada a segunda operação, cria 3 itens com a
referência à mesma lista!
EXERCÍCIO 5.27
Escreva um programa que crie uma matriz bidimensional usando 2 comandos
for encaixados, isto é, não use nem multiplicação nem lista por compreensão
para criar sua matriz.
EXERCÍCIO 5.28
Escreva um programa que crie uma matriz tridimensional usando o mecanismo de
lista por compreensão.
5.12 DICIONÁRIOS
Imagine o seguinte problema: você precisa armazenar em uma estrutura de dados o nome e a matrícula de cada aluno de uma turma. Até agora nossa única estrutura é a lista, então teria de ser ela mesma. Uma lista desse tipo poderia ser assim:
turma = [‘Linus’, 123456, ‘João’, 132344, ‘Denis’, 6
54321, ‘Ada’, 321456]
Uma turma pequena, mas que serve para explicar o conceito
desta seção.
Olhando para a lista, se você quiser que seu programa obtenha
a matrícula de ‘João’, você teria que fazê-lo procurar qual a posição do nome ‘João’ e então pegar o dado seguinte a ele. Nada prático, principalmente porque se baseia em uma convenção externa à própria organização da lista. Convencionamos que o elemento seguinte ao nome é a matrícula, mas isso pode levar facilmente ao erro. Não seria melhor se o próprio nome ‘João’ servisse como índice para a sua matrícula?
É para isso que serve um dicionário em Python, que funciona
como um mapa associativo. Veja:
turma = {‘Linus’:123456, ‘João’:102344, ‘Dennis’:654
321,
‘Ada’:321456}
print(turma[‘João’])
print(turma)
■ Programa 5.32: Programa que cria um dicionário.
No Programa 5.32 foi criado um dicionário chamado turma. A
sintaxe é bem simples. Cada item de um dicionário é composto de um par de elementos. O primeiro elemento é que será usado como índice. O segundo elemento é a informação que se deseja buscar a partir do índice. Os elementos são separados por dois pontos (:) e os pares separados por vírgulas.
A execução do programa gera:
102344
{‘João’: 102344, ‘Dennis’: 654321, ‘Linus’: 123456, ‘Ada’: 321456}
Uma segunda execução gera:
102344
{‘Linus’: 123456, ‘Ada’: 321456, ‘Dennis’: 654321, ‘ João’: 102344}
Percebeu a diferença? A ordem dos elementos impressos mudou entre as duas execuções. A ordem dos elementos em um dicionário não é predeterminada, ou seja, os elementos não são ordenados. Python otimiza o acesso a cada elemento, podendo gerar uma ordem diferente a cada execução.
Como a lista, um dicionário é uma estrutura mutável, então podemos criar um dicionário vazio e ir acrescentando-lhe itens.
filmes = {} #cria dicionário vazio
filmes[1975] = ‘Em Busca do Cálice Sagrado’ filmes[1979] = ‘A Vida de Brian’
filmes[1983] = ‘O Sentido da Vida’
print(filmes)
■ Programa 5.33: Dicionário de filmes.
O programa gera:
{1979: ‘A Vida de Brian’, 1983: ‘O Sentido da Vida’, 1975: ‘Em Busca do Cálice Sagrado’}
A forma de imprimir não ficou muito boa. Podemos melhorar isso iterando sobre o dicionário. Veja o Programa 5.34.
filmes = {
1975: ‘Em Busca do Cálice Sagrado’,
1979: ‘A Vida de Brian’,
1983: ‘O Sentido da Vida’
}
for ano in filmes:
print(
‘”’ + filmes[ano] + ‘” foi lançado em ‘ + st
r(ano))
■ Programa 5.34: Impressão em cada linha de filmes.
Note que o ano, por ser inteiro, teve que ser convertido para
string com a função str(). Agora temos uma saída mais bem organizada:
“A Vida de Brian” foi lançado em 1979
“O Sentido da Vida” foi lançado em 1983
“Em Busca do Cálice Sagrado” foi lançado em 1975
O Programa 5.35 apresenta diversos métodos para a
manipulação de um dicionário.
filmes = {1975:’Em Busca do Cálice Sagrado’,
1979:’A Vida de Brian’,
1983:’O Sentido da Vida’,
1989:’Erik, O Viking’}
del(filmes[1989]) #apaga elemento
print(‘Values:’, filmes.values())
print(‘Itens:’, filmes.items())
print(‘Chaves:’, filmes.keys())
print(‘Filme de 1979:’, filmes.get(1979))
print(‘Filme de 1971:’, filmes.get(1971))
filmes[1971]=’E Agora Para Algo Completamente Difere
nte’
print(‘Filme de 1971:’, filmes.get(1971))
for ano in filmes:
print (‘“‘ + filmes[ano] + ‘“ foi lançado em ‘ +
str(ano))
■ Programa 5.35: Diversos métodos para um dicionário.
gerando o resultado:
Values: dict_values([‘A Vida de Brian’, ‘O Sentido d
a Vida’,
‘Em Busca do Cálice Sagrado’])
Itens: dict_items([(1979, ‘A Vida de Brian’), (1983, ‘O Sentido
da Vida’), (1975, ‘Em Busca do Cálice Sagrado’)]) Chaves: dict_keys([1979, 1983, 1975]) Filme de 1979: A Vida de Brian
Filme de 1971: None
Filme de 1971: E Agora Para Algo Completamente Difer ente
“E Agora Para Algo Completamente Diferente” foi lanç ado em 1971
“A Vida de Brian” foi lançado em 1979 “O Sentido da Vida” foi lançado em 1983 “Em Busca do Cálice Sagrado” foi lançado em 1975
Muitos métodos são fornecidos para manipular um dicionário. Como visto no programa anterior:
del() apaga um item.
values() recupera a informação armazenada.
items() recupera todos os pares de informação.
keys() retorna as chaves do dicionário.
get() é uma forma segura de recuperar uma informação. Retorna None se a chave não existir.
A função get() é utilizada se você não tem certeza de que uma chave está no dicionário. Por exemplo, se você tenta ter acesso a um item com a maneira clássica: filmes[1971] e este ano não existe no dicionário, você terá um erro de execução de seu programa, que irá parar. Com get(), se o item não existir, a função simplesmente retorna None, como visto na saída do programa, e continua a executar.
Um dicionário é um mapeamento, assim, diferentemente das listas, funções que dependem da ordenação dos elementos, como concatenação e fatiamento, não funcionam e disparam erros na execução do programa.