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
precos = [4.5, 2.0, 6.0]precos[2] → 6.0
precos = {'Maçã': 4.5, 'Banana': 2.0, 'Uva': 6.0}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.
Lista ou dicionário?
A mesma ideia, duas formas de achar o valor| Lista | Dicionário | |
|---|---|---|
| Escreve com | [4.5, 2.0, 6.0] | {'Maçã': 4.5, 'Uva': 6.0} |
| Acha o valor por | posição: v[0] | chave: d['Uva'] |
| Colocar | v.append(x) | d['Kiwi'] = 9.0 |
| Trocar | v[0] = 5.0 | d['Uva'] = 5.0 |
| Apagar | del v[0] | del d['Uva'] |
in pergunta | se o valor está lá | se a chave está lá |
| Repete? | pode ter valores repetidos | chave não repete; valor pode repetir |
| Use para | vários valores do mesmo tipo, em ordem | achar 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.
precos['Uva']len(precos)'Banana' in precos6.0 in precosprecos.get('Kiwi', 0)precos.get('Kiwi')list(precos.keys())precos['Kiwi']precos[0]
Criar, trocar e apagar
A mesma linha cria ou troca · del apagaA mesma linha cria ou troca
agenda = {} # vazioagenda['Ana'] = '9999-1234' # não existia: criaagenda['Ana'] = '8888-0000' # já existia: trocaprint(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
produtos = {'arroz': 5.0, 'feijão': 8.0}nome = 'arroz'if nome in produtos:del produtos[nome] # apaga chave e valorelse: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.
Consultar sem dar erro
in ou .get(): dois jeitos de não travar o programaPedir 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.
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.
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.
Percorrer: .keys(), .values() e .items()
Com for e com while, do jeito do professor| Escreve | Cada volta recebe | Com 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 valor | 4.5, 2.0, 6.0 |
for k, p in precos.items(): | o par, desempacotado | ('Maçã', 4.5), ('Banana', 2.0)... |
Com for
precos = {'Maçã': 4.5, 'Banana': 2.0, 'Uva': 6.0}for fruta, preco in precos.items():print(fruta, preco)
Com while (o professor prefere)
precos = {'Maçã': 4.5, 'Banana': 2.0, 'Uva': 6.0}chaves = list(precos.keys())i = 0while 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.
Os moldes que mais aparecem
Contar · agrupar numa lista · lista e dicionário dentro do dicionárioContar quantas vezes cada um aparece
frase = 'arara'cont = {}for c in frase:if c in cont:cont[c] = cont[c] + 1else:cont[c] = 1print(cont)
Agrupar numa lista por chave
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
estoque = {'tomate': [1000, 2.30]}qtd = estoque['tomate'][0]preco = estoque['tomate'][1]estoque['tomate'][0] = qtd - 5print(estoque)
Dicionário dentro do dicionário
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.
- d = {'a': 1}d['a'] = 5d['b'] = 2print(d)
- d = {'x': 1, 'y': 2}del d['x']print(d, len(d))
- d = {'a': 1, 'b': 2}for k in d:print(k, end=' ')
- d = {}for c in 'ovo':d[c] = d.get(c, 0) + 1print(d)
- d = {'a': [1, 2]}d['a'].append(3)print(d['a'][2])
Veja o dicionário crescendo
Contando as letras de “banana”, passo a passofrase = input()cont = {}for c in frase:if c in cont:cont[c] = cont[c] + 1else:cont[c] = 1print(cont)
Linha 1frase = input() → 'banana' (o usuário digitou "banana")
banana
Erros que mais aparecem na prova
6 errosPedir 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()):