• Nenhum resultado encontrado

Capitulo 2 Preparando o ambiente

6.17 Dicionários U

Dicionários consistem em urna estrutura de dados similar ás listas, mas com propriedades de acesso diferentes. Um dicionário é composto por um conjunto de chaves e valores. O dicionário em si consiste em relacionar urna chave a um valor específico.

Em Python, criamos dicionários utilizando chaves ({}). Cada elemento do dicionário é urna combinagáo de chave e valor. Vejamos u m exemplo onde os presos de mercadorias sejam como os da tabela 6.2.

7abela 6.2 - Pregos de m ercadorias

Produto ■ Pre?o • Alface RS 0,45 Batata R$ 1,20 Tomate R$ 2,30 Feijáo RS 1,50

A tabela 6.2 pode ser vista como um dicionário, onde chave seria o produto, e valor, seu prego. Vejamos como criar esse dicionário em Python na listagem 6.45. Listagem 6.45 - C riad o de um dicionário

tabe la = { "Alface": 0.45, "Batata": 1.20, "Tomate": 2.30, "Feijao": 1.50 >

Um dicionário é acessado po r suas chaves. Para obter o prego da alface, digite no interpretador, depois de ter criado a tabela, tabela["Alface"], onde tabela é o nome da variável do tipo dicionário e ‘Alface” é nossa chave. O valor retornado é o mesmo que associamos na tabela, ou seja, 0,45.

Diferentemente de listas, onde o índice é um número, dicionários utilizara suas chaves como índice. Quando atribuimos um valor a urna chave, duas coisas podem ocorrer:

1. Se a chave já existe: o valor associado é alterado para o novo valor. 2. Se a chave nao existe: a nova chave será adicionada ao dicionário.

118 In tro d u jo á Programado com Python

Observe a listagem 6.46. Em Oí acessamos o valor associado á chave “Tomate”. Em O , alteramos o valor associado á chave “Tomate” para um novo valor. Observe que o valor anterior foi perdido. Em O í criamos urna nova chave, “Cebóla” que é adicionada ao dicionário. Veja tam bém como Python imprime o dicionário. O utra diferenga entre dicionários e listas é que, ao utilizarmos dicionários, perdemos a nogáo de ordem. Observe que, durante a manipulagao do dicionário, a ordem das chaves foi alterada.

Listagem 6 .4 6 - Fundonamento do dicionário

» > tab e la = { "Alface": 0.45, "B atata": 1.20, "Tomate”: 2.30, . . . “F eijao": 1.50 } » > p rin t(ta b e la [ "Tomate"]) O 2.3

» > p rin t(ta b e la )

{ 'B a ta ta ': 1 .2 , 'A lfa c e ': 0.45, 'Tomate': 2 .3, 'F e ija o 1: 1.5} » > tabela["Tomate“] = 2.50 O

» > print(tabela["Tom ate"]) 2.5

» > tabela["C ebóla”] = 1.20 © » > p rin t(ta b e la )

{ 'B a ta ta ': 1.2, 'A lface': 0.45, 'Tomate': 2.5, 'C ebóla': 1.2, 'F e ija o ': 1.5}

Quanto ao acesso aos dados, temos que verificar se urna chave existe antes de acessá-la (listagem 6.47).

Listagem 6 .4 7 - Acesso a urna chave inexistente

>>> tab e la = { "Alface": 0.45, "B atata": 1.20, . . . "Tomate": 2.30, . . . "Feijao": 1.50 } >>> print(tabela["M anga"]) Traceback (most recent c a l i l a s t ) :

F ile "<stdin>", lin e 1, in <module> KeyError: 'Manga'

Se a chave nao existir, urna excegao do tipo KeyError será ativada. Para verificar se urna chave pertence ao dicionário, podemos usar o operador in (listagem 6.48).

Capítulo 6 ■ Listas 119

Listagem 6.48 - V erificado da existencia de urna chave

» > tab e la = { "Alface": 0.45, "B atata": 1,20, "Tomate": 2.30, "Feijao": 1.50 > >>> print("Manga" in tab e la ) False

>>> p rint("B atata" in tab e la ) True

Podemos também obter urna lista com as chaves do dicionário, ou mesmo urna lista dos valores associados (listagem 6.49).

Listagem 6.49 - Obtengo de urna lista de chaves e valores

>>> tab e la = { "Alface": 0.45, "Batata": 1.20, . . . "Tomate": 2.30, — "Feijao": 1.50 >

» > p rin t(ta b e la .k e y s ())

d ic t_ k e y s (['B a ta ta ', 'A lfa c e ', 'Tomate', 'F e ija o ']) » > p rin t(ta b e la .v a lu e s Q )

d ict_v alues([1.2, 0.45, 2.3, 1 .5])

Observe que os métodos keys() e valúes () retornam geradores. Vocé pode utilizá-los diretam ente dentro de um for ou transformá-los em lista usando a fungao list.

Vejamos u m program a que utiliza dicionários para exibir o prego de um pro- duto n a listagem 6.50.

a

Listagem 6.50 - O btengo do prego com um dicionário

tab e la = { "Alface": 0.45, "Batata": 1.20, "Tomate": 2.30, "Feijao": 1.50 } while True:

produto=input("Digite o nome do produto, fim para term inar:") i f produto == "fim":

break

i f produto in tab ela: O

print("P reco %5.2f" % tabela[p ro d uto]) 0 else:

120 In tro d u jo á Programado com Python

Em O verificamos se o dicionário contém a chave procurada. Em caso afirma­ tivo, imprimimos o prego associado á chave, ou haverá urna mensagem de erro. Para apagar urna chave, utilizaremos a instrugáo del (listagem 6.51). Listagem 6.51 - Exdusáo de urna associagáo do dicionário

» > tab e la = { “Alface": 0.45, "B atata”: 1.20, "Tomate”: 2.30, "Feijao": 1.50 } » > del tabela["Tomate"] > » p rin t(ta b e la )

{ 'B a ta ta ': 1.2, 'A lfa ce': 0.45, 'F e ija o ': 1.5}

Vocé pode estar se perguntando quando utilizar listas e quando utilizar dicio- nários.Tudo depende do que vocé deseja realizar. Se seus dados sao fácilmente acessados po r suas chaves, quase nunca vocé precisa acessá-los de urna só vez: um dicionário é mais interessante. Além disso, vocé pode acessar os valores associados a urna chave rápidamente sem pesquisar. A implementagáo interna de dicionários tam bém garante urna boa velocidade de acesso quando temos m uitas chaves. Porém, um dicionário nao organiza suas chaves, ou seja, as pri- méiras chaves inseridas nem sempre seráo as primeiras na lista de chaves. Se seus dados precisam preservar a ordem de insergáo (fila, p ilh a ,...), dicionários nao seráo urna opgao.

6.18 Dicionários com listas

Em Python, podemos ter dicionários nos quais as chaves sao assodadas a listas o u mesmo a outros dicionários. Imagine urna relagáo de estoque de mercado- rias onde teríamos, além do prego, a quantidade em estoque (listagem 651). Listagem 6.52 - Dicionário com listas

estoque={ "tomate": [ 1000, 2.30], "alface": [ 500, 0.4 5 ], "batata": [ 2001, 1.20], "fe ijao " : [ 100, 1.50] }

Nesse caso, o nom e do produto é a chave, e a lista consiste nos valores as­ sociados, urna lista p o r chave. O primeiro elemento da lista é a quantidade disponível, e o segundo, o prego do produto.

Capítulo 6 ■ Listas 121

Urna ap licad o seria processarmos urna lista de operagóes e calcular o prego total de venda, atualizando também a quantidade em estoque.

Listagem 6.53 - Exemplo de didonário com estoque e o p e ra re s de venda

estoque={ "tomate": [ 1000, 2.30]., " alfa ce" : [ 500, 0.45], " b atata": [ 2001, 1.20], "fe ijao " : [ 100, 1.50] }

venda = [ [ ”tomate", 5 ], ["b a ta ta ", 10], [" a lfa c e " ,5]] t o t a l = 0

p rin t( "Vendas: \n ") fo r operagao in venda:

produto, quantidade = op erad o O prego = estoque[produto][1] © custo = prego * quantidade print("%12s: %3d x %6.2f = %6.2f" % (produto, quantidade,prego,custo)) estoque[produto][0] -= quantidade © tota!+=custo p rin t(" Custo t o t a l : %21.2f\n” % t o ta l) p r in t("Estoque:\n ")

fo r chave, dados in estoque.item s(): © print("D escrigao: ", chave) print("Quantidade: ", dados[0]) print("Prego: %6.2f\n" % dados[1])

Em O utilizamos urna operagao de desempacotamento, como já fizemos com

for e enumérate. Como operagao é urna lista com dois elementos, ao escrevermos

produto, quantidade temos o prim eiro elemento de operagao atribuido a produto, e o seguido, a quantidade. Dessa forma, a construgáo é equivalente a:

produto = operagao[0] quantidade = operagao[l]

Em © , utilizamos o conteúdo de produto como chave no didonário estoque. Como nossos dados sao urna lista, escolhemos o segundo elemento, que armazena o pregó do referido produto. Observe que atribuir nomes a cada um desses componentes facilita a leitura do programa. Imagine escrever:

prego = estoque[operagao[0]][l]

Em © , atualizamos a quantidade em estoque subtraindo a quantidade vendida do estoque a cual,

122 In tro d u jo á Programado com Python

Já em O utilizamos o método items do objeto dicionário. O método ítems retorna urna tupia contendo a chave e o valor de cada item armazenado no dicionário. Usando um for com duas variáveis, chave e dados, efetuamos o desempacota- mento desses valores em urna só passagem. Para entender m elhor como isso acontece, experimente alterar o programa para exibir o valor de chave e dados a cada iteradlo.

Exercído 6 .1 7 -A ltere o program a da listagem 6.53 de forma a solicitar ao usu- ário o p roduto e a quantidade vendida. Verifique se o nom e d o produto digitado existe no dicionário e só entáo efetue a baixa em estoque. Exercído 6.18 - Escreva um program a que gere um dicionário, onde cada chave

seja u m caractere e seu valor seja o núm ero desse caractere encontrado em urna frase lida.

Documentos relacionados