edubun
Português

Dicionários

Procurar uma chave que não está num dicionário interrompe o programa com KeyError, mas d.get(key, 0) devolve 0 no lugar.

Seoyeon tem 12 cédulas e três candidatos

ContextoSeoyeon (uma aluna inventada) está contando os votos para representante de turma. Três colegas concorrem: Ari, Bo e Cy. Doze cédulas dobradas estão numa caixa. No papel, ela escreveria os três nomes ao longo da página e faria um risco ao lado de um nome cada vez que abrisse uma cédula. Ela quer fazer o mesmo em Python e logo percebe que uma lista é pouco prática para isso. Com uma lista, teria de lembrar que a posição 0 é Ari e a posição 1 é Bo. O que ela quer é uma tabela que vá direto de um nome a um número.

Essa tabela é um dicionário. Um dicionário guarda pares: uma chave e o valor que vai com ela. Escreve-se entre chaves, com dois-pontos entre cada chave e seu valor. Para ler um valor, ponha a chave entre colchetes, como você poria um índice depois de uma lista. Para acrescentar um par ou alterar um, atribua a essa chave.

votes = {"Ari": 0, "Bo": 0, "Cy": 0}
votes["Bo"] = votes["Bo"] + 1
votes["Ari"] += 1
votes["Bo"] += 1
print(votes)
print(votes["Bo"])
Saída
{'Ari': 1, 'Bo': 2, 'Cy': 0}
2
Um dicionário associa cada chave a um valor. votes["Bo"] vai direto a 5 sem contar posições.

Contando a caixa inteira num só laço

Digitar uma linha por cédula não é melhor que fazer riscos. Seoyeon põe as cédulas numa lista e percorre a lista num laço. Há um obstáculo: e se uma cédula citar alguém que ela não cadastrou antes, ou se ela preferir não listar os candidatos primeiro? Ler uma chave inexistente com colchetes interrompe o programa. O método get(key, default) resolve isso. Ele devolve o valor se a chave existir e o padrão se não existir, então votes.get(name, 0) + 1 funciona para o primeiro voto e para todos os seguintes.

ballots = ["Bo", "Ari", "Bo", "Cy", "Bo", "Ari",
           "Cy", "Bo", "Ari", "Bo", "Cy", "Bo"]
votes = {}
for name in ballots:
    votes[name] = votes.get(name, 0) + 1
print(votes)
print(len(ballots), sum(votes.values()))
Saída
{'Bo': 6, 'Ari': 3, 'Cy': 3}
12 12

A última linha é a conferência da Seoyeon. Doze cédulas entraram, e as contagens somam doze, então nenhuma se perdeu. Repare na ordem dos nomes na saída: Bo primeiro, porque Bo foi o primeiro nome que o laço encontrou. Desde o Python 3.7, um dicionário mantém suas chaves na ordem em que foram acrescentadas, e a seção do tutorial sobre dicionários diz o mesmo.

Percorrendo chaves e valores juntos

Um laço for sobre um dicionário dá as chaves. items() dá chave e valor juntos, que é o que você quer para uma tabela de resultados. in verifica se uma chave existe, e max() com key=votes.get acha a chave de maior valor. Esse último é um padrão que vale copiar como está, mesmo antes de cada parte fazer sentido.

votes = {"Bo": 6, "Ari": 3, "Cy": 3}
for name, n in votes.items():
    print(name, "#" * n, n)
print("Dan" in votes)
print(max(votes, key=votes.get))
Saída
Bo ###### 6
Ari ### 3
Cy ### 3
False
Bo

Os dicionários aparecem onde quer que os dados venham em pares de nome e valor: uma palavra e seu significado, uma estação de metrô e o número da linha, um número de matrícula e um nome. As chaves são únicas, e atribuir a uma chave existente substitui o valor antigo em vez de acrescentar uma segunda cópia.

dicionárioPares chave: valor entre { }
chaveO nome pelo qual você procura um valor; as chaves são únicas
d[key]Lê o valor; KeyError se a chave não existir
d.get(key, default)Lê o valor, ou dá o padrão se a chave não existir
d.items()Pares de chave e valor para um laço for
key in dTrue se o dicionário tem essa chave
  1. O que isto mostra?
    price = {"gimbap": 3500, "ramen": 4500}
    print(price["ramen"])
  2. O que isto mostra?
    price = {"gimbap": 3500}
    price["tteokbokki"] = 5000
    print(len(price))
  3. O que isto mostra?
    price = {"gimbap": 3500}
    price["gimbap"] = 4000
    print(price)
  4. O que isto mostra?
    stock = {"pens": 4}
    print(stock.get("pens", 0), stock.get("tape", 0))
  5. O que acontece quando isto é executado?
    stock = {"pens": 4}
    print(stock["tape"])
    • Imprime 0
    • Imprime None
    • Imprime tape
    • Para com KeyError: 'tape'
  6. O que isto mostra?
    counts = {}
    for ch in "hello":
        counts[ch] = counts.get(ch, 0) + 1
    print(counts["l"])
  7. O que isto mostra?
    ages = {"Mina": 14, "Jun": 13}
    print("Jun" in ages, 14 in ages)
  8. O que isto mostra?
    d = {"b": 2, "a": 1}
    for k in d:
        print(k)
    • a
      b
    • b
      a
    • 2
      1
    • b 2
      a 1
  9. O que isto mostra?
    scores = {"Ari": 3, "Bo": 6, "Cy": 3}
    print(max(scores, key=scores.get))
  10. O que isto mostra?
    d = {"x": 1, "y": 2}
    total = 0
    for k, v in d.items():
        total += v
    print(total)
Erros comuns
  • "votes["Dan"] dá 0 se Dan não recebeu votos." Se "Dan" nunca foi acrescentado como chave, a busca para com KeyError: 'Dan'. Use votes.get("Dan", 0) quando uma chave puder faltar.
  • "14 in ages verifica se alguém tem 14 anos." in olha as chaves, não os valores. Para procurar nos valores, escreva 14 in ages.values().
  • "Os dicionários têm posições como as listas, então votes[0] é o primeiro candidato." Um dicionário é consultado por chave, não por posição. votes[0] procura uma chave igual a 0 e dá KeyError: 0.
Nota do professorOs riscos no papel são a ponte. Conte primeiro à mão um pequeno conjunto de votos reais ou inventados e depois mostre que o dicionário é a mesma tabela, o nome à esquerda e a contagem à direita. A linha get(key, 0) + 1 vale ser memorizada como uma unidade, porque contar coisas é o trabalho mais comum dos dicionários em projetos de iniciantes. Conferir se as contagens somam de volta o número de cédulas é um hábito bom de criar cedo. No curso coreano de informática do ensino médio, escolher o tipo de dado certo é um padrão por si só, e uma comparação entre dicionário e lista cabe ali.
Pontos-chave
  • Um dicionário guarda pares chave: valor entre { }.
  • d[key] lê um valor; uma chave inexistente dá KeyError.
  • d.get(key, default) evita o KeyError.
  • counts[x] = counts.get(x, 0) + 1 é o padrão de contagem.
  • for k, v in d.items(): percorre os pares na ordem em que foram acrescentados.
Fontes deste curso (6)
  • Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
  • Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
  • Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
  • General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
  • Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
  • Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)

Data de verificação: 2026-10-19