Pular para o conteúdo
Praticar: 20 fichas
2ª unidade · atualLição 4 de 4~15 min de leitura20 fichas para praticar

Dicionários

Na lista, cada valor é achado pela posição. No dicionário, cada valor é achado por um nome, a chave. É como uma agenda: você procura pelo nome da pessoa e acha o telefone. Ele é escrito com chaves, em pares chave: valor.

Nesta lição0 de 6 vistas
  1. 1Lista ou dicionário?
  2. 2Criar, trocar e apagar
  3. 3Consultar sem dar erro
  4. 4Percorrer: .keys(), .values() e .items()
  5. 5Os moldes que mais aparecem
  6. 6Veja o dicionário crescendo
Lista: acha pela posição
precos = [4.5, 2.0, 6.0]
4.5[0]2.0[1]6.0[2]

precos[2] → 6.0

Dicionário: acha pelo nome
precos = {'Maçã': 4.5, 'Banana': 2.0, 'Uva': 6.0}
4.5'Maçã'2.0'Banana'6.0'Uva'

precos['Uva'] → 6.0

No teste de mesa, cada par aparece assim: o valor em cima e a chave embaixo, no lugar onde a lista mostra a posição.

1

Lista ou dicionário?

A mesma ideia, duas formas de achar o valor
ListaDicionário
Escreve com[4.5, 2.0, 6.0]{'Maçã': 4.5, 'Uva': 6.0}
Acha o valor porposição: v[0]chave: d['Uva']
Colocarv.append(x)d['Kiwi'] = 9.0
Trocarv[0] = 5.0d['Uva'] = 5.0
Apagardel v[0]del d['Uva']
in perguntase o valor está láse a chave está lá
Repete?pode ter valores repetidoschave não repete; valor pode repetir
Use paravários valores do mesmo tipo, em ordemachar um valor pelo nome: preço da fruta, nota do aluno, quantas vezes cada letra aparece

Antes de rodar, preveja

Com precos do exemplo. Se der erro, escreva erro.

9 perguntas
  1. precos['Uva']
  2. len(precos)
  3. 'Banana' in precos
  4. 6.0 in precos
  5. precos.get('Kiwi', 0)
  6. precos.get('Kiwi')
  7. list(precos.keys())
  8. precos['Kiwi']
  9. precos[0]
2

Criar, trocar e apagar

A mesma linha cria ou troca · del apaga

A mesma linha cria ou troca

exemplo.py
agenda = {} # vazio
agenda['Ana'] = '9999-1234' # não existia: cria
agenda['Ana'] = '8888-0000' # já existia: troca
print(agenda)

Não existe append no dicionário. Se a chave é nova, o par entra no fim; se a chave já existe, só o valor muda e ela continua no mesmo lugar.

Apagar com del

exemplo.py
produtos = {'arroz': 5.0, 'feijão': 8.0}
nome = 'arroz'
if nome in produtos:
del produtos[nome] # apaga chave e valor
else:
print('Produto não encontrado')
print(produtos)

O del também dá KeyError se a chave não existir, por isso o if com in vem antes.

3

Consultar sem dar erro

in ou .get(): dois jeitos de não travar o programa

Pedir com colchetes uma chave que não existe para o programa. Antes de usar a chave, confira se ela está lá ou peça com um valor padrão.

erro.py
precos = {'Maçã': 4.5, 'Uva': 6.0}
print(precos['Kiwi'])

No Thonny aparece KeyError: 'Kiwi'. A linha 2 pediu uma chave que não existe.

jeito1.py
precos = {'Maçã': 4.5, 'Uva': 6.0}
fruta = 'Kiwi'
if fruta in precos:
print(precos[fruta])
else:
print('Não temos')

Qual usar? Use o in quando o programa faz coisas diferentes se a chave existe ou não. Use .get(chave, padrão) quando basta um valor no lugar, como 0.0 para um produto fora da tabela.

4

Percorrer: .keys(), .values() e .items()

Com for e com while, do jeito do professor
EscreveCada volta recebeCom o dicionário de cima
for k in precos:a chave'Maçã', 'Banana', 'Uva'
for k in precos.keys():a chave (igual ao de cima)'Maçã', 'Banana', 'Uva'
for p in precos.values():o valor4.5, 2.0, 6.0
for k, p in precos.items():o par, desempacotado('Maçã', 4.5), ('Banana', 2.0)...

Com for

exemplo.py
precos = {'Maçã': 4.5, 'Banana': 2.0, 'Uva': 6.0}
for fruta, preco in precos.items():
print(fruta, preco)

Com while (o professor prefere)

exemplo.py
precos = {'Maçã': 4.5, 'Banana': 2.0, 'Uva': 6.0}
chaves = list(precos.keys())
i = 0
while i < len(chaves):
fruta = chaves[i]
print(fruta, precos[fruta])
i = i + 1

O dicionário não tem posição, então o while anda numa lista das chaves.

Com as funções nativas: sum(precos.values()) soma os valores, len(precos) conta os pares e dict(zip(nomes, valores)) junta duas listas num dicionário.

5

Os moldes que mais aparecem

Contar · agrupar numa lista · lista e dicionário dentro do dicionário

Contar quantas vezes cada um aparece

exemplo.py
frase = 'arara'
cont = {}
for c in frase:
if c in cont:
cont[c] = cont[c] + 1
else:
cont[c] = 1
print(cont)

Agrupar numa lista por chave

exemplo.py
itens = [('pão', 'padaria'), ('leite', 'frios'), ('bolo', 'padaria')]
grupos = {}
for produto, categoria in itens:
if categoria not in grupos:
grupos[categoria] = []
grupos[categoria].append(produto)
print(grupos)

Lista dentro do dicionário

exemplo.py
estoque = {'tomate': [1000, 2.30]}
qtd = estoque['tomate'][0]
preco = estoque['tomate'][1]
estoque['tomate'][0] = qtd - 5
print(estoque)

Dicionário dentro do dicionário

exemplo.py
alunos = {'João': {'Mat': 8.0, 'Port': 7.5}}
print(alunos['João']['Mat'])
for nome, notas in alunos.items():
print(nome, sum(notas.values()) / len(notas))

Escreva o que cada programa exibe

Se exibir mais de uma linha, separe com espaço. Se der erro, escreva erro.

5 perguntas
  1. d = {'a': 1}
    d['a'] = 5
    d['b'] = 2
    print(d)
  2. d = {'x': 1, 'y': 2}
    del d['x']
    print(d, len(d))
  3. d = {'a': 1, 'b': 2}
    for k in d:
    print(k, end=' ')
  4. d = {}
    for c in 'ovo':
    d[c] = d.get(c, 0) + 1
    print(d)
  5. d = {'a': [1, 2]}
    d['a'].append(3)
    print(d['a'][2])
6

Veja o dicionário crescendo

Contando as letras de “banana”, passo a passo
Contar as letrasentradas: banana
frase = input()
cont = {}
for c in frase:
if c in cont:
cont[c] = cont[c] + 1
else:
cont[c] = 1
print(cont)
frasestr'banana'nasceu agora

Linha 1frase = input() → 'banana' (o usuário digitou "banana")

banana
1 / 27

Erros que mais aparecem na prova

6 erros
Pedir uma chave que não existe.

precos['Kiwi'] dá KeyError quando não há Kiwi. Confira antes com if 'Kiwi' in precos: ou use precos.get('Kiwi', 0), que devolve o padrão em vez de dar erro.

Esperar que o in olhe os valores.

'Banana' in precos procura nas chaves. Para procurar um valor, use 6.0 in precos.values().

Usar append no dicionário.

append é de lista. Para colocar um par no dicionário, basta atribuir: precos['Kiwi'] = 9.0.

Contar sem criar a chave antes.

cont[c] = cont[c] + 1 na primeira vez dá KeyError, porque a letra ainda não é chave. Use if c in cont: soma, senão cria com 1, ou cont[c] = cont.get(c, 0) + 1.

Escrever a chave diferente.

'uva', 'Uva' e 'UVA' são três chaves diferentes, assim como 'Maçã' e 'Maca'. A chave tem que ser igual letra por letra.

Mudar o tamanho do dicionário dentro do for dele.

Criar ou apagar chaves enquanto o for percorre o próprio dicionário dá RuntimeError. Percorra uma cópia das chaves: for k in list(d.keys()):

Complemento, não atalho. O laboratório ajuda a entender a lógica. Para fixar de verdade, escreva do zero no Thonny ou no seu editor.