edubun
Español

Diccionarios

Buscar una clave que no está en un diccionario detiene el programa con KeyError, pero d.get(key, 0) devuelve 0 en su lugar.

Seoyeon tiene 12 papeletas y tres candidatos

ContextoSeoyeon (una estudiante inventada) cuenta los votos para delegada de la clase. Se presentan tres compañeros: Ari, Bo y Cy. Doce papeletas dobladas están en una caja. En papel, escribiría los tres nombres en el lado de una hoja y agregaría una marca junto a un nombre cada vez que abre una papeleta. Quiere hacer lo mismo en Python, y pronto descubre que una lista es incómoda para eso. Con una lista tendría que recordar que la posición 0 es Ari y la posición 1 es Bo. Lo que quiere es una tabla que vaya directo de un nombre a un número.

Esa tabla es un diccionario. Un diccionario guarda pares: una clave y el valor que le corresponde. Se escribe entre llaves, con dos puntos entre cada clave y su valor. Para leer un valor, pon la clave entre corchetes, igual que pondrías un índice después de una lista. Para agregar un par o cambiar uno, asigna a esa clave.

votes = {"Ari": 0, "Bo": 0, "Cy": 0}
votes["Bo"] = votes["Bo"] + 1
votes["Ari"] += 1
votes["Bo"] += 1
print(votes)
print(votes["Bo"])
Salida
{'Ari': 1, 'Bo': 2, 'Cy': 0}
2
Un diccionario asocia cada clave con un valor. votes["Bo"] va directo a 5 sin contar posiciones.

Contar toda la caja en un solo bucle

Escribir una línea por papeleta no es mejor que las marcas. Seoyeon pone las papeletas en una lista y la recorre con un bucle. Hay un inconveniente: ¿qué pasa si una papeleta nombra a alguien que no preparó de antemano, o si prefiere no listar primero a los candidatos? Leer una clave que no existe con corchetes detiene el programa. El método get(key, default) lo resuelve. Devuelve el valor si la clave está y el valor predeterminado si no, así que votes.get(name, 0) + 1 funciona para el primer voto y para todos los siguientes.

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()))
Salida
{'Bo': 6, 'Ari': 3, 'Cy': 3}
12 12

La última línea es la comprobación de Seoyeon. Entraron doce papeletas y los recuentos suman doce, así que no se perdió ninguna. Fíjate en el orden de los nombres en la salida: Bo primero, porque Bo fue el primer nombre que encontró el bucle. Desde Python 3.7, un diccionario conserva sus claves en el orden en que se agregaron por primera vez, y la sección del tutorial sobre diccionarios dice lo mismo.

Recorrer claves y valores juntos

Un bucle for sobre un diccionario da las claves. items() da la clave y el valor juntos, que es lo que quieres para una tabla de resultados. in comprueba si existe una clave, y max() con key=votes.get encuentra la clave con el valor más grande. Este último es un patrón que vale la pena copiar tal cual, incluso antes de entender cada parte.

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))
Salida
Bo ###### 6
Ari ### 3
Cy ### 3
False
Bo

Los diccionarios aparecen donde los datos vienen en pares de nombre y valor: una palabra y su significado, una estación de metro y su número de línea, un número de alumno y un nombre. Las claves deben ser únicas, y asignar a una clave existente reemplaza su valor anterior en lugar de agregar una segunda copia.

diccionarioPares clave: valor entre { }
claveEl nombre con el que buscas un valor; las claves son únicas
d[key]Lee el valor; KeyError si falta la clave
d.get(key, default)Lee el valor, o da el valor predeterminado si falta la clave
d.items()Pares de clave y valor para un bucle for
key in dTrue si el diccionario tiene esa clave
  1. ¿Qué imprime esto?
    price = {"gimbap": 3500, "ramen": 4500}
    print(price["ramen"])
  2. ¿Qué imprime esto?
    price = {"gimbap": 3500}
    price["tteokbokki"] = 5000
    print(len(price))
  3. ¿Qué imprime esto?
    price = {"gimbap": 3500}
    price["gimbap"] = 4000
    print(price)
  4. ¿Qué imprime esto?
    stock = {"pens": 4}
    print(stock.get("pens", 0), stock.get("tape", 0))
  5. ¿Qué pasa al ejecutar esto?
    stock = {"pens": 4}
    print(stock["tape"])
    • Imprime 0
    • Imprime None
    • Imprime tape
    • Se detiene con KeyError: 'tape'
  6. ¿Qué imprime esto?
    counts = {}
    for ch in "hello":
        counts[ch] = counts.get(ch, 0) + 1
    print(counts["l"])
  7. ¿Qué imprime esto?
    ages = {"Mina": 14, "Jun": 13}
    print("Jun" in ages, 14 in ages)
  8. ¿Qué imprime esto?
    d = {"b": 2, "a": 1}
    for k in d:
        print(k)
    • a
      b
    • b
      a
    • 2
      1
    • b 2
      a 1
  9. ¿Qué imprime esto?
    scores = {"Ari": 3, "Bo": 6, "Cy": 3}
    print(max(scores, key=scores.get))
  10. ¿Qué imprime esto?
    d = {"x": 1, "y": 2}
    total = 0
    for k, v in d.items():
        total += v
    print(total)
Errores frecuentes
  • «votes["Dan"] da 0 si Dan no obtuvo votos». Si "Dan" nunca se agregó como clave, la búsqueda se detiene con KeyError: 'Dan'. Usa votes.get("Dan", 0) cuando una clave pueda faltar.
  • «14 in ages comprueba si alguien tiene 14 años». in mira las claves, no los valores. Para buscar entre los valores, escribe 14 in ages.values().
  • «Los diccionarios tienen posiciones como las listas, así que votes[0] es el primer candidato». Un diccionario se consulta por clave, no por posición. votes[0] busca una clave igual a 0 y da KeyError: 0.
Nota para docentesLas marcas en papel son el puente. Primero cuenta a mano un pequeño conjunto de votos reales o inventados, y luego muestra que el diccionario es la misma tabla, el nombre a la izquierda y el recuento a la derecha. La línea get(key, 0) + 1 vale la pena memorizarla como unidad, porque contar cosas es el trabajo más común de los diccionarios en los proyectos de principiantes. La comprobación de que los recuentos vuelven a sumar el número de papeletas es un hábito que conviene crear pronto. En el curso coreano de informática de bachillerato, elegir el tipo de dato adecuado es un estándar en sí mismo, y una comparación entre diccionario y lista encaja ahí.
Ideas clave
  • Un diccionario guarda pares clave: valor entre { }.
  • d[key] lee un valor; una clave que falta da KeyError.
  • d.get(key, default) evita el KeyError.
  • counts[x] = counts.get(x, 0) + 1 es el patrón de conteo.
  • for k, v in d.items(): recorre los pares en el orden en que se agregaron.
Fuentes de este 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)

Fecha de consulta: 2026-10-19