Dicionários

Dicionários funcionam de forma muito semelhante as listas, entretanto, em vez de trabalharmos com índicies numériocos e sequenciais, utilizamos uma chave. Esta chave serve tanto para adicionar um valor ao dicionário quanto para recuperar o mesmo do dicionário. Portanto podemos afirmar que um dicionário associa uma CHAVE a um VALOR. É importante ressaltar que a chave e o valor podem ser do tipo string, inteiro ou float. O valor também pode ser booleano ou uma lista.

Exemplos de CHAVE : VALOR

"Marcio" : 3
"Ana" : 5
"Fabricio": 9
"Júlia" : 1

No exemplo anterior nome da pessoa é a chave e o número é um valor associado a aquela pessoa.

A primeira vista os dicionários podem não parecer grande coisa, mas em alguns casos eles simplificam muito a implementação de alguns algorítmos, que seriam muito mais complexos de implementar se utilizássemos listas.

Para representarmos a criação de um dicionário em python utilizamos as chaves {}. Potanto para criarmos um dicionário vazio, fazemos da seguinte forma:

In [1]:
cadastro = {}
print cadastro
{}

Como podes checar, é muito semelhante a criação de uma variável comum ou uma lista, damos um nome ao dicionário e usamos as chaves para indicar que é um dicionário para o python. Como não tem chaves dentro do dicionário o python mostra apenas as chaves quando tentamos imprimir o dicionário.

Para adicionar itêns ao nosso dicionário de cadastro, temos que associar cada chave ao seu valor utilizando : (dois pontos) para separar o nome da chave e o valor associaldo à mesma.

Exemplo:

In [2]:
cadastro = {"Marcio":3, "Ana":5, "Fabricio":9, "Julia":1}
print cadastro
{'Marcio': 3, 'Ana': 5, 'Julia': 1, 'Fabricio': 9}

Agora temos um dicionário com alguns itêns dentro dele. Para recuperarmos o valor associado a alguma das pessoas no dicionário podemos utilizar a chave (neste caso o nome) de cada indivíduo. Este acesso é muito parecido com as listas, utilizamos os colchetes, mas em vez de informarmos o índice, informamos a chave.

Exemplo:

In [3]:
cadastro = {"Marcio":3, "Ana":5, "Fabricio":9, "Julia":1}
print cadastro["Marcio"]
print cadastro["Fabricio"]
3
9

Veja que interessante, agora podemos recuperar a quantidade de cada pessoa utilizando o seu nome (chave). Mas e se quisermos alterar o valor associado a esta chave?

Para alterar um valor associado a uma chave utilizamos a mesma sintaxe das listas, com o colchetes, só que em vez do indíce utilizamos a chave. Outro fato interessante é que podemos adicionar novos elementos no dicionário utilizando esta sintaxe, coisa que não funciona com listas (temos que utilizar o append).

Exemplos:

In [4]:
cadastro = {"Marcio":3, "Ana":5, "Fabricio":9, "Julia":1}
print cadastro
cadastro["Marcio"] = 10
cadastro["Joana"] = 5
print cadastro
{'Marcio': 3, 'Ana': 5, 'Julia': 1, 'Fabricio': 9}
{'Marcio': 10, 'Joana': 5, 'Ana': 5, 'Julia': 1, 'Fabricio': 9}

Como podemos ver o Marcio teve seu valor alterado para 10 e a Joana foi adicionada ao dicionário posteriormente. Ambos utilizando a mesma sintaxe.

Mas e se eu quiser varer todo o dicionario para, por exemplo, porcessar todos os itens presentes nele? Bom, para isso podemos utilizar o for:

In [5]:
cadastro = {"Marcio":3, "Ana":5, "Fabricio":9, "Julia":1}
for chave in cadastro:
    print chave
Marcio
Ana
Julia
Fabricio

Com o for podemos iterar sobre cada chave do dicionário. E com isso temos cada uma das chaves a cada iteração, e se quisermos pegar o valor de cada chave é só chamar o dicionario com ela:

In [6]:
cadastro = {"Marcio":3, "Ana":5, "Fabricio":9, "Julia":1}
for chave in cadastro:
    print "A Chave: " + chave + " tem o valor: " + str(cadastro[chave])
A Chave: Marcio tem o valor: 3
A Chave: Ana tem o valor: 5
A Chave: Julia tem o valor: 1
A Chave: Fabricio tem o valor: 9

Como podemos ver pelos exemplos, os dicionários são muito parecidos com as listas, podemos adicionar novos itêns, podemos iterar sobre eles, podemos remover... remover? Sim podemos vermover um item de um dicionario. Para isso, utilizamos a palavra del.

Exemplo:

In [7]:
cadastro = {"Marcio":3, "Ana":5, "Fabricio":9, "Julia":1}
print cadastro
del cadastro["Marcio"]
print cadastro
{'Marcio': 3, 'Ana': 5, 'Julia': 1, 'Fabricio': 9}
{'Ana': 5, 'Julia': 1, 'Fabricio': 9}

A remoção de itêns em um dicionário é muito tranquilia. Como não temos indices, outra coisa que podemos fazer é checar se uma chave existe no dicionário. Para isso utilizamos a palavra in :

In [8]:
cadastro = {"Marcio":3, "Ana":5, "Fabricio":9, "Julia":1}
print "Marcio" in cadastro
del cadastro["Marcio"]
print "Marcio" in cadastro
True
False

O comando in retorna True quando a chave esta no dicionário e False quando não. Observe que isso poderia ser utilizado em um if para tomar algum tipo de decisão ou em um while para ser o controle de alguma repetição.

Vamos a um exemplo mais concreto? Você lembra do exercício 7 da Lista do capítulo 4 ? Mas especificamente este:

Escreva um programa que leia n números. Depois da leitura mostre a quantidade de cada número lido. Ex: Leu [ 5, 6, 8, 5, 6, 7] Mostrar 5 = 2, 6 = 2, 8 = 1, 7 = 1

Então, com dicionários é muito simples de resolver este exercício. =)

Solução:

In [9]:
numeros = [] #cria uma lista vazia.

#Le os N números
c = ""
while c != "sair":
    c = raw_input("digite um número ou sair: ")
    if c != 'sair':
        numeros.append(int(c))

print "Foram lidos: " +  str(numeros)

quantidades = {} #cria um dicionário vazio, a chave será o número contado e o valor a quantidade.

for n in numeros:
    if n in quantidades: #caso já exista a chave, só incrementa o valor dela
        quantidades[n] = quantidades[n] + 1
    else: # caso não exista, a chave recebe 1 e é criada
        quantidades[n] = 1
        
#mostra a quantidade de cada número

for q in quantidades:
    print str(q) +  " = " + str(quantidades[q])     
        
digite um número ou sair: 10
digite um número ou sair: 15
digite um número ou sair: 10
digite um número ou sair: 15
digite um número ou sair: 2
digite um número ou sair: 2
digite um número ou sair: sair
Foram lidos: [10, 15, 10, 15, 2, 2]
10 = 2
2 = 2
15 = 2

Bem mais simples né? Como podemos ver neste exemplo, a chave pode ser um número inteiro também. Os dicionários permitem que coloquemos listas como valor. Para isso é só atribuir uma lista a uma chave. Vamos a um exemplo, digamos que queremos guardar duas notas de cada aluno e seu nome:

In [10]:
alunos = {}

for i in range(0,5):
    nome = raw_input("digite o nome do aluno: ")
    n1 = int(raw_input("digite a nota 1 do aluno " + nome + ": "))
    n2 = int(raw_input("digite a nota 2 do aluno " + nome + ": "))
    alunos[nome] = [n1, n2] #cria a chave com o nome e associa as duas notas ao mesmo dentro de uma lista
    
for a in alunos:
    print "o aluno " + a + " tem as notas: " + str(alunos[a])
digite o nome do aluno: Ana
digite a nota 1 do aluno Ana: 1
digite a nota 2 do aluno Ana: 2
digite o nome do aluno: Vitor
digite a nota 1 do aluno Vitor: 2
digite a nota 2 do aluno Vitor: 1
digite o nome do aluno: Claudio
digite a nota 1 do aluno Claudio: 10
digite a nota 2 do aluno Claudio: 9
digite o nome do aluno: Gotam
digite a nota 1 do aluno Gotam: 10
digite a nota 2 do aluno Gotam: 6
digite o nome do aluno: Goku
digite a nota 1 do aluno Goku: 10
digite a nota 2 do aluno Goku: 10
o aluno Goku tem as notas: [10, 10]
o aluno Gotam tem as notas: [10, 6]
o aluno Ana tem as notas: [1, 2]
o aluno Claudio tem as notas: [10, 9]
o aluno Vitor tem as notas: [2, 1]

Os dicionários aceitam como valor qualquer tipo de dado, incluindo as listas! E, tambem podemos incluir um dicionário dentro de um valor. !!!

Exemplo:

In [11]:
clientes = {}

for i in range(0,3):
    nome = raw_input("digite o nome do cliente: ")
    
    compras = {}
    
    c = ""
    while c != "sair":
        c = raw_input("digite o produto ou sair: ")
        if c != 'sair':
            compras[c] = int(raw_input("digite a quantidade comprada de " + str(c) + ": "))
            
    clientes[nome] = compras
    
for c in clientes:
    print "o cliente " + c + " comprou:"
    
    compras = clientes[c]
    
    for compra in compras:
        print  str(compras[compra]) + "x " + compra
digite o nome do cliente: Ash
digite o produto ou sair: pokebolas
digite a quantidade comprada de pokebolas: 3
digite o produto ou sair: doce raro
digite a quantidade comprada de doce raro: 98
digite o produto ou sair: sair
digite o nome do cliente: maria
digite o produto ou sair: Bacon
digite a quantidade comprada de Bacon: 3
digite o produto ou sair: Feijão
digite a quantidade comprada de Feijão: 1
digite o produto ou sair: sair
digite o nome do cliente: Marcio
digite o produto ou sair: cerveja
digite a quantidade comprada de cerveja: 50
digite o produto ou sair: sair
o cliente Marcio comprou:
50x cerveja
o cliente Ash comprou:
98x doce raro
3x pokebolas
o cliente maria comprou:
1x Feijão
3x Bacon

Outros comandos que podem ser úteis em dicionários:

1- para obter as chaves de um dicionário podemos utilizar a função .keys() 2- para obter os valores de um dicionário podemos utilizar a função .values()

Exemplo

In [12]:
sabeProgramar = {"Marcia":True, "Vitor":False, "Claudio":True}

print sabeProgramar.keys()
print sabeProgramar.values()
['Vitor', 'Claudio', 'Marcia']
[False, True, True]
In [ ]: