Diccionarios y conjuntos en Python

Aprende cómo los diccionarios de Python almacenan valores asociados a claves para consultar datos por su nombre, contar las apariciones de cada elemento, agrupar elementos en categorías y organizar registros dentro de otros registros. Después, usa conjuntos para eliminar duplicados y comparar colecciones mediante la unión, la intersección y la diferencia, y aprende cuándo conviene elegir un diccionario, un conjunto, una lista o una tupla.

PrincipianteUnidad 7 de 10 del curso Curso de Introducción a la programación con Python

Lo que aprenderás

  1. Explica qué es un diccionario, construye uno a partir de pares clave-valor, lee valores por clave sin que el programa se detenga por claves ausentes y añade, modifica y elimina entradas.
    • Construye diccionarios a partir de pares clave-valor
      Describe un diccionario como una colección que asocia claves únicas a valores, escribe literales de diccionario, construye diccionarios con dict() y elige claves que Python acepte.
    • Consulta valores por clave de forma segura
      Lee un valor con corchetes, comprueba si una clave existe con in y usa get() para proporcionar un valor predeterminado en lugar de detener el programa por una clave ausente.
    • Añade, modifica y elimina entradas
      Inserta elementos nuevos, actualiza valores existentes, fusiona dos diccionarios y elimina entradas con del, pop() y métodos relacionados.
  2. Visita cada clave, valor o par clave-valor de un diccionario, calcula totales e informes ordenados y crea diccionarios nuevos con bucles y diccionarios por comprensión.
    • Recorre claves, valores y pares clave-valor con bucles
      Usa bucles for con un diccionario, .values() y .items(), ordena las claves por nombre o por valor y evita cambiar el tamaño de un diccionario mientras lo recorres.
    • Construye diccionarios nuevos a partir de datos existentes
      Crea diccionarios con bucles y diccionarios por comprensión para transformar valores, filtrar elementos, emparejar listas e intercambiar claves y valores.
  3. Usa un diccionario como un conjunto de contadores, reúne elementos en grupos y suma totales por categoría, tareas cotidianas de los diccionarios en programas reales.
    • Cuenta las apariciones de cada elemento
      Construye una tabla de frecuencias con un diccionario de contadores, cuenta las palabras de un texto, encuentra los elementos más frecuentes y reconoce Counter como un atajo.
    • Agrupa elementos y suma valores por categoría
      Reúne elementos en listas bajo una clave compartida, suma importes por categoría, calcula medias de grupos y evita que las claves compartan listas por accidente.
  4. Representa registros como diccionarios dentro de diccionarios o listas, lee y actualiza valores a cualquier profundidad y recorre datos anidados con bucles para resumirlos.
    • Almacena registros y accede a ellos en diccionarios anidados
      Construye diccionarios de diccionarios, listas de diccionarios y diccionarios de listas, accede a valores con consultas encadenadas, actualízalos y copia datos anidados de forma segura.
    • Recorre datos anidados con bucles y resúmelos
      Usa bucles, incluidos bucles anidados, para generar informes, filtrar y resumir registros, y trata los registros con campos ausentes o listas vacías.
  5. Crea conjuntos de valores únicos, comprueba la pertenencia, compara colecciones mediante la unión, la intersección y la diferencia, y elige entre listas, tuplas, diccionarios y conjuntos.
    • Crea conjuntos y elimina duplicados
      Escribe y modifica conjuntos, explica por qué no contienen duplicados ni tienen orden, comprueba la pertenencia y elimina duplicados de una lista conservando o sin conservar su orden.
    • Compara colecciones con operaciones de conjuntos
      Usa la unión, la intersección, la diferencia y la diferencia simétrica, comprueba subconjuntos, superconjuntos y conjuntos disjuntos, y distingue los operadores que devuelven conjuntos nuevos de los métodos que modifican un conjunto.
    • Elige la colección adecuada para una tarea
      Compara listas, tuplas, diccionarios y conjuntos, elige lo que necesite cada tarea y combínalos, incluidas las operaciones de conjuntos con claves de diccionarios.

Guía de estudio de Diccionarios y conjuntos en Python

5 capítulos

1

Almacena y consulta datos con diccionarios

Un diccionario conecta cada clave con un valor, lo que permite consultar contactos, inventarios y otros registros por su nombre. Para construirlo y modificarlo, primero hay que saber qué identifica una clave y qué significa su valor. Una consulta segura permite al programa distinguir un registro ausente de un valor existente igual a cero. Añadir, fusionar y eliminar pares modifica esa información almacenada siguiendo reglas predecibles sobre el orden de inserción.

1.1 Construye diccionarios a partir de pares clave-valor

Un diccionario almacena pares: una clave identifica un elemento y su valor contiene la información que quieres. Una lista de contactos es un modelo útil: un nombre lleva a un número de teléfono. Una consulta en un diccionario usa una clave, incluso cuando esa clave es un número.

Escribe los pares
ages = {"Ana": 31, "Ben": 27, "Cara": 35}
print(ages["Ben"])
print(len(ages))

Esto imprime 27 y después 3. Los dos puntos unen cada clave con su valor; las comas separan los pares. len cuenta pares. Tanto {} como dict() crean un diccionario vacío.

Cada clave aparece solo una vez. En {"a": 1, "b": 2, "a": 3}, el valor posterior de "a" sustituye al anterior y deja {'a': 3, 'b': 2}. Dos claves diferentes pueden tener el mismo valor: {"Ana": "blue", "Ben": "blue"} sigue teniendo dos elementos.

Construye a partir de otros datos

Elige la forma que corresponda a los datos de entrada:

colors = dict(red=1, blue=2)
coordinates = dict([("x", 10), ("y", 20)])
labels = dict(zip(["a", "b", "c"], [1, 2, 3]))

La primera forma crea claves de cadena a partir de los nombres de los argumentos. La segunda lee una secuencia de pares de dos elementos. La tercera empareja los elementos correspondientes de dos listas y produce {'a': 1, 'b': 2, 'c': 3}. Las cadenas de la primera forma son 'red' y 'blue', no consultas de variables.

Elige claves válidas

Las claves de diccionario deben ser aptas para hash. Las cadenas y los números sirven, al igual que las tuplas formadas íntegramente por elementos aptos para hash. Las listas, los diccionarios y los conjuntos ordinarios no sirven como claves. Para una ubicación, usa (2, 3), una tupla, en lugar de [2, 3], una lista:

board = {(0, 0): "start", (2, 3): "treasure"}
print(board[(2, 3)])

Esto imprime treasure. Los paréntesis convierten el par de coordenadas en una sola clave. Una tupla que contenga una lista sigue incumpliendo la regla de aptitud para hash. Los valores de diccionario no tienen esa restricción: un valor puede ser una lista, otro diccionario o cualquier otro tipo.

Las claves numéricas iguales hacen referencia a la misma entrada. Como 1, 1.0 y True son iguales al compararlos, {1: "one", 1.0: "float one"} contiene un par, con el valor 'float one'. La cadena "1" es una clave distinta del número 1.

Distingue el orden de la identidad

Desde Python 3.7, los diccionarios conservan el orden de inserción. Las edades anteriores aparecen como Ana, Ben, Cara al imprimirlas o recorrerlas con un bucle. Siguen teniendo claves, no posiciones de lista: ages[0] solicita la clave 0 y lanza KeyError: 0.

Los diccionarios son mutables. Después de backup = ages, ambos nombres hacen referencia al mismo diccionario. Asignar backup["Ana"] = 32 también cambia el valor al que se accede mediante ages. Para copiar el diccionario externo, escribe backup = ages.copy() o backup = dict(ages). Los diccionarios externos independientes pueden seguir compartiendo listas y diccionarios anidados.

Puntos clave

  • Cada clave única se asocia a un valor; len(d) cuenta los pares.
  • Las claves deben ser aptas para hash; los valores pueden ser de cualquier tipo.
  • Las claves iguales comparten una entrada, y las asignaciones posteriores sustituyen su valor.
  • El orden de inserción no convierte las claves de diccionario en posiciones.
  • La asignación comparte un diccionario; copy() crea un diccionario externo independiente.

1.2 Consulta valores por clave de forma segura

La consulta debe ajustarse a lo que signifique una clave ausente en tu programa. A veces indica un error. Otras veces es normal, como un producto que aún no se ha contado. Python te ofrece distintas formas de tratar esos casos.

Lee un valor existente
stock = {"apples": 12, "pears": 0, "plums": 7}
print(stock["plums"])

La consulta con corchetes devuelve 7. Las claves deben coincidir exactamente: "Plums" es diferente de "plums". Leer stock["kiwis"] lanza KeyError: 'kiwis' porque esa clave no existe. No proporciona un valor vacío ni un conteo de cero.

Usa esta consulta directa cuando la clave sea obligatoria. Así, un error llama la atención sobre datos incompletos o un fallo de escritura en el lugar donde ocurre.

Comprueba si hay una clave

La expresión key in stock comprueba si una clave existe. "pears" in stock es True, aunque su valor almacenado sea cero. "kiwis" not in stock también es True.

item = "kiwis"
if item in stock:
    print(stock[item])
else:
    print("No stock record for", item)

Aquí, la clave ausente provoca un mensaje. La consulta solo se realiza en la rama en la que la clave existe.

La comprobación de pertenencia en un diccionario busca claves. 12 in stock es False; para preguntar si algún elemento tiene un valor almacenado de 12, escribe 12 in stock.values(). La colección que coloques después de in determina dónde se busca.

Lee con un valor predeterminado

stock.get("kiwis") devuelve None sin lanzar KeyError. Proporciona un segundo argumento para elegir otro valor predeterminado: stock.get("kiwis", 0) devuelve 0. Ninguna de las llamadas inserta un elemento nuevo. Después de ambas llamadas, el diccionario sigue conteniendo solo manzanas, peras y ciruelas.

Pregunta que hace el programaForma útil
¿Cuál es el valor de esta clave obligatoria?stock[item]
¿Existe esta clave?item in stock
¿Cuál es el valor, o una alternativa si no existe?stock.get(item, 0)

El valor predeterminado sustituye el resultado de una consulta ausente, no un valor almacenado. stock.get("pears", 99) devuelve 0 porque las peras ya tienen un valor.

No confundas cero con ausente

if stock.get("pears"): comprueba el valor de verdad del valor devuelto. Cero se considera falso, así que se omite esa rama. La misma prueba también omite una clave ausente cuya consulta devuelve None. Para distinguir esos casos, comprueba directamente la pertenencia de la clave.

Procesa un pedido completo
prices = {"coffee": 3.5, "tea": 2.75}
order = ["tea", "coffee", "tea", "soda"]
total = 0
for item in order:
    if item in prices:
        total += prices[item]
    else:
        print("No price for", item)
print(total)

El primer té lleva el total a 2,75, el café lo lleva a 6,25 y el segundo té lo lleva a 9,0. El refresco produce el mensaje No price for soda y no añade nada. Una consulta directa en cada iteración fallaría con el refresco; usar sin aviso un precio predeterminado de cero ocultaría que falta el precio. La rama separada hace visible esa información ausente.

Puntos clave

  • d[key] lanza KeyError cuando la clave no existe.
  • in comprueba las claves, incluidas aquellas cuyos valores son cero o están vacíos.
  • get devuelve un valor o un valor predeterminado sin insertar una clave.
  • Elige un valor predeterminado solo cuando tenga sentido para la tarea.

1.3 Añade, modifica y elimina entradas

Las actualizaciones de diccionarios usan claves para identificar lo que cambia. Asignar un valor puede añadir un par nuevo o sustituir un valor anterior. Eliminar un par también puede devolver información que necesites, como la cantidad retirada de un inventario.

Añade y sustituye
scores = {"Ana": 8}
scores["Ben"] = 6
scores["Ana"] = 9
scores["Ben"] += 2
print(scores)

El resultado es {'Ana': 9, 'Ben': 8}. Se añade a Ben, se actualiza a Ana y después aumenta la puntuación existente de Ben. La línea con += lee primero el valor anterior, así que lanza KeyError para una clave ausente. Los diccionarios no tienen un método append.

Combina diccionarios

update copia pares en un diccionario existente. Con esas puntuaciones, scores.update({"Ben": 7, "Cara": 10}) cambia la de Ben a 7 y añade a Cara con 10.

Desde Python 3.9, el operador de fusión puede construir un diccionario nuevo:

left = {"x": 1, "y": 2}
right = {"y": 5, "z": 3}
merged = left | right
print(merged)

Esto imprime {'x': 1, 'y': 5, 'z': 3}. Para una clave compartida, prevalece el lado derecho. left permanece sin cambios; left |= right actualizaría el objeto original.

update() devuelve None. Escribir scores = scores.update(new_scores) modifica el diccionario anterior y después hace que scores haga referencia a None. Llama a update en una línea propia. Asigna el resultado de left | right cuando quieras un diccionario nuevo fusionado.

Elimina pares
OperaciónEfecto y valor de retorno
del d[key]Elimina el par; una clave ausente provoca KeyError.
d.pop(key)Elimina el par y devuelve su valor; una clave ausente provoca KeyError.
d.pop(key, 0)Devuelve 0 si la clave no existe.
d.popitem()Elimina y devuelve como tupla el último par insertado.
d.clear()Elimina todos los pares y devuelve None.

Para {"a": 1, "b": 2, "c": 3}, popitem() devuelve ('c', 3). Esto usa el orden de inserción, no el orden alfabético ni el valor máximo.

Sigue un cambio de inventario
inventory = {"pens": 10, "pads": 4}
inventory["pens"] -= 3
inventory["clips"] = 50
removed = inventory.pop("pads")

La venta deja 7 bolígrafos. Añadir clips crea una clave nueva. Eliminar los blocs almacena 4 en removed y deja {'pens': 7, 'clips': 50}. El valor devuelto por pop permite al programa usar la cantidad retirada después de que el par haya desaparecido.

Inserta solo si no existe

setdefault(key, default) devuelve el valor existente o inserta y devuelve el valor predeterminado cuando la clave no existe. Para stock = {"apples": 12, "pears": 0, "plums": 7}, stock.setdefault("kiwis", 0) inserta los kiwis y devuelve 0. stock.setdefault("apples", 99) devuelve 12 y deja las manzanas sin cambios. Esta inserción es la diferencia con get.

Actualizar una clave existente mantiene su lugar. A partir de {"a": 1, "b": 2, "c": 3}, asignar d["a"] = 10 mantiene "a" en primer lugar. Eliminar "a" y volver a insertarla la coloca después de "c". Sustituir un valor e insertar un par nuevo afectan al orden de manera distinta.

Puntos clave

  • d[key] = value añade una clave o sustituye su valor.
  • Al fusionar diccionarios, para una clave compartida prevalece el valor de la derecha.
  • pop devuelve un valor eliminado; popitem devuelve el último par insertado.
  • update y clear devuelven None.
  • setdefault inserta un valor predeterminado solo para una clave ausente.
  • Actualizar conserva el lugar de una clave; eliminarla y reinsertarla la mueve al final.
2

Recorre diccionarios con bucles y construye otros nuevos

Los bucles convierten un diccionario en un informe, un total o la entrada de una colección nueva. La primera decisión es qué necesita cada iteración: una clave, un valor o ambas partes de un par. La ordenación controla el orden de un informe sin reorganizar el diccionario original. Una comprensión puede expresar una regla breve para conservar o transformar pares, mientras que los bucles normales dejan espacio para varios pasos de procesamiento y comprobaciones.

2.1 Recorre claves, valores y pares clave-valor con bucles

Elige un bucle que te proporcione la parte de cada par que necesitas. Un diccionario por sí solo proporciona claves. Sus vistas pueden proporcionar valores o pares completos, para que no tengas que recuperar información que el bucle podría darte directamente.

Visita claves, valores o pares
temps = {"Mon": 68, "Tue": 75, "Wed": 71}
for day, temp in temps.items():
    print(day, temp)

Las temperaturas están en grados Fahrenheit. Esto imprime Mon 68, Tue 75 y Wed 71 en líneas separadas, en orden de inserción. Cada elemento es una tupla de dos elementos que el bucle desempaqueta en day y temp.

Entrada del bucleQué recibe cada iteración
temps o temps.keys()Una clave de día
temps.values()Un valor de temperatura
temps.items()Un par (day, temperature)

Con for day in temps:, usa temps[day] dentro del bucle cuando necesites el valor correspondiente. Si el programa necesita ambas partes cada vez, .items() suele expresar la tarea con más claridad.

Comprende las vistas

keys(), values() e items() devuelven vistas, que reflejan los cambios posteriores en su diccionario. No son listas y no permiten acceder por índices de posición. temps.keys()[0] lanza TypeError. Convierte a una lista cuando necesites una instantánea con posiciones: list(temps) produce ['Mon', 'Tue', 'Wed'].

Calcula un total o encuentra la clave correspondiente

sum(temps.values()) devuelve 214, y dividir entre len(temps) produce una media de aproximadamente 71,33. max(temps.values()) devuelve 75. Para encontrar qué día tiene ese valor, escribe max(temps, key=temps.get), que devuelve 'Tue'.

El argumento key= proporciona una función que se usa para comparar. Aquí Python visita las claves de día y llama a temps.get para cada una para obtener su temperatura. Escribe el nombre de la función sin llamarla: temps.get, no temps.get(). Si los valores empatan, max devuelve la primera clave que encuentra.

Ordena un informe

sorted(temps) devuelve las claves en orden alfabético. sorted(temps.items()) devuelve los pares ordenados por clave. Para ordenar las claves de día por temperatura, usa sorted(temps, key=temps.get), que produce ['Mon', 'Wed', 'Tue']. Añade reverse=True para obtener ['Tue', 'Wed', 'Mon']. Estas llamadas devuelven listas; no reorganizan temps.

grades = {"Ana": 88, "Ben": 72, "Cara": 95}
passing = 0
for name, grade in grades.items():
    print(f"{name}: {grade}")
    if grade >= 75:
        passing += 1

El informe imprime cada nombre con su calificación. Ana y Cara alcanzan el umbral, así que passing termina en 2.

Elimina entradas sin interrumpir el recorrido

No añadas ni elimines claves mientras iteras directamente sobre un diccionario. Cambiar su tamaño puede lanzar RuntimeError: dictionary changed size during iteration. Sí se permite sustituir un valor existente.

Para eliminar los días más frescos, usa for day in list(temps): y elimina temps[day] cuando su valor sea inferior a 70. El bucle recorre una lista independiente de claves y deja {'Tue': 75, 'Wed': 71} en el diccionario. Construir un diccionario nuevo filtrado es otra forma de separar el recorrido de los cambios.

Puntos clave

  • Recorre un diccionario para obtener claves, .values() para valores o .items() para pares.
  • Las vistas reflejan los cambios; las listas permiten acceder por posición.
  • key=d.get compara los valores almacenados al devolver u ordenar claves.
  • La ordenación devuelve una lista y deja intacto el orden del diccionario.
  • Recorre una copia de la lista de claves cuando elimines entradas.

2.2 Construye diccionarios nuevos a partir de datos existentes

Un diccionario nuevo suele surgir de una regla aplicada a datos existentes. Empieza con un bucle que puedas explicar y después usa una comprensión cuando la misma regla quepa con claridad en una expresión.

Construye un par cada vez
words = ["kiwi", "fig", "banana"]
lengths = {}
for word in words:
    lengths[word] = len(word)

Cada iteración elige una palabra como clave y su longitud como valor. El resultado es {'kiwi': 4, 'fig': 3, 'banana': 6}. El diccionario se crea antes del bucle para que los pares anteriores sigan disponibles en las iteraciones posteriores.

Un diccionario por comprensión expresa el mismo trabajo:

lengths = {word: len(word) for word in words}

Lee la parte de for para ver qué se visita y después la expresión anterior para ver qué par se produce. Los dos puntos separan la expresión de la clave de la expresión del valor. Sin esos dos puntos, {word for word in words} construye un conjunto.

Conserva algunos elementos

Una cláusula if filtra la entrada:

grades = {"Ana": 88, "Ben": 72, "Cara": 95}
high_grades = {
    name: grade
    for name, grade in grades.items()
    if grade >= 80
}

Ana y Cara cumplen la condición, lo que produce {'Ana': 88, 'Cara': 95}. El par de Ben queda fuera. El diccionario de entrada no cambia; el resultado contiene solo los pares que cumplen la condición.

Transforma valores

Una comprensión puede conservar los días mientras convierte las lecturas de Fahrenheit a Celsius:

temps = {"Mon": 68, "Tue": 75, "Wed": 71}
celsius = {
    day: round((f - 32) * 5 / 9, 1)
    for day, f in temps.items()
}

El resultado es {'Mon': 20.0, 'Tue': 23.9, 'Wed': 21.7}. Para el martes, restar 32 da 43; multiplicar por 5 y dividir entre 9 da aproximadamente 23,89. round(..., 1) almacena 23,9. La clave se mantiene mientras cambia el valor.

Empareja listas con cuidado

dict(zip(names, scores)) empareja cada nombre con la puntuación de la misma posición. zip se detiene cuando termina la entrada más corta. Emparejar ["Ana", "Ben", "Cara"] con [90, 85] produce {'Ana': 90, 'Ben': 85}. Ningún error avisa de que falta la puntuación de Cara, así que comprueba las longitudes de entrada cuando cada nombre deba tener una.

Intercambia claves y valores
favorites = {"Ana": "blue", "Ben": "red", "Cara": "blue"}
by_color = {color: name for name, color in favorites.items()}

El resultado es {'blue': 'Cara', 'red': 'Ben'}. Tanto Ana como Cara necesitarían la misma clave nueva, así que el par posterior de Cara sustituye al de Ana. La inversión conserva todos los pares solo cuando los valores anteriores son únicos y aptos para hash. Un valor de tipo lista no puede convertirse en una clave de diccionario. Para conservar varios nombres bajo un color, almacena una lista de nombres bajo ese color.

Usa un bucle normal cuando la tarea necesite varias sentencias, mensajes o comprobaciones. Una comprensión resulta útil porque hace visible una regla breve; comprimir en ella un procedimiento más extenso dificulta seguir la regla.

Puntos clave

  • Un diccionario por comprensión produce un par clave-valor por cada elemento de entrada seleccionado.
  • Una cláusula if filtra; las expresiones del par pueden transformar los datos.
  • zip se detiene al terminar la entrada más corta.
  • Invertir un diccionario puede hacer que se pierdan entradas cuando los valores se repiten.
3

Cuenta y agrupa datos con diccionarios

Los diccionarios pueden reunir resultados mientras un bucle procesa datos. Un contador almacena un número por cada elemento distinto; un diccionario de agrupación almacena varios miembros bajo cada categoría. Ambos patrones deben tratar la primera aparición de una clave y conservar lo acumulado en las iteraciones anteriores. Una vez creados los grupos, sus listas permiten calcular totales y medias, y las herramientas de la biblioteca estándar pueden simplificar la inicialización.

3.1 Cuenta las apariciones de cada elemento

Una tabla de frecuencias responde cuántas veces aparece cada elemento distinto. Sus claves identifican los elementos; sus valores son contadores. El diccionario crece cuando aparece un elemento nuevo, mientras que las apariciones posteriores aumentan un conteo existente.

Sigue la evolución de un contador
counts = {}
for letter in "banana":
    if letter in counts:
        counts[letter] += 1
    else:
        counts[letter] = 1

La primera letra crea 'b': 1. La siguiente crea 'a': 1 y después se crea 'n': 1. La siguiente "a" aumenta su conteo existente a 2. Después de las dos últimas letras, el diccionario es {'b': 1, 'a': 3, 'n': 2}. Su orden registra cuándo apareció cada letra por primera vez, no cuál es la más frecuente.

Usa cero antes de la primera aparición

Las dos ramas pueden convertirse en una asignación:

counts = {}
for letter in "banana":
    counts[letter] = counts.get(letter, 0) + 1

El lado derecho lee el conteo anterior, usando cero cuando la clave no existe, y después suma uno. El lado izquierdo almacena ese conteo nuevo. get por sí mismo no inserta nada; la asignación sí.

Usar solo counts[letter] += 1 falla cuando una letra es nueva. Mover counts = {} al interior del bucle causa otro problema: cada iteración borra los conteos anteriores. Inicializa una vez antes de procesar los elementos.

Decide qué cuenta como la misma palabra

En un texto, las mayúsculas, las minúsculas y la puntuación afectan a las claves. Las cadenas "The" y "the" son distintas, al igual que "dog." y "dog". Normaliza las formas antes de usarlas como claves:

text = "The cat saw the dog. The dog ran."
counts = {}
for word in text.lower().split():
    word = word.strip(".,!?")
    counts[word] = counts.get(word, 0) + 1

Esto produce {'the': 3, 'cat': 1, 'saw': 1, 'dog': 2, 'ran': 1}. lower convierte a minúsculas, split separa las palabras por los caracteres de espacio en blanco y strip elimina de los extremos los signos de puntuación indicados. No elimina signos de puntuación del interior de una palabra.

Encuentra los elementos más frecuentes

Para esta tabla no vacía, max(counts, key=counts.get) devuelve 'the'. Para encontrar las dos palabras más frecuentes, usa sorted(counts, key=counts.get, reverse=True)[:2], que produce ['the', 'dog']. Los conteos iguales mantienen su orden original al ordenarse.

El patrón también cuenta números o tuplas. Para los lanzamientos [3, 6, 3, 1, 6, 3], construye {3: 3, 6: 2, 1: 1}. Un valor que nunca se ha observado no tiene entrada. Léelo con un valor predeterminado de cero cuando resulte útil.

Reconoce el atajo de la biblioteca
from collections import Counter
letter_counts = Counter("banana")
print(letter_counts.most_common(1))
print(letter_counts["z"])

Esto imprime [('a', 3)] y después 0. La importación permite usar Counter, de la biblioteca estándar de Python. Un Counter es un diccionario diseñado para contar: sus claves son elementos aptos para hash y la consulta directa de un elemento ausente devuelve cero. Sus conteos para esta entrada se muestran como Counter({'a': 3, 'n': 2, 'b': 1}).

Puntos clave

  • Una tabla de frecuencias asocia cada elemento distinto a su conteo.
  • Inicializa el diccionario antes del bucle.
  • counts[item] = counts.get(item, 0) + 1 trata tanto elementos nuevos como repetidos.
  • Normaliza las palabras antes de contarlas cuando debas ignorar las mayúsculas, las minúsculas y la puntuación.
  • Compara los conteos con key=counts.get para ordenar los elementos por frecuencia.
  • Counter construye conteos y devuelve cero al consultar claves ausentes.

3.2 Agrupa elementos y suma valores por categoría

Un diccionario puede almacenar un grupo completo bajo cada clave. La clave nombra la categoría y una lista contiene los elementos que se le asignan. Así, todos los miembros quedan disponibles para calcular totales, medias o informes posteriores.

Construye listas independientes para los grupos
words = ["apple", "bean", "avocado", "beet", "corn"]
groups = {}
for word in words:
    first = word[0]
    if first not in groups:
        groups[first] = []
    groups[first].append(word)

Para "apple", el programa crea una lista vacía bajo "a" y añade la palabra. "bean" inicia una lista "b" independiente. "avocado" se incorpora a la lista "a" existente. El resultado es {'a': ['apple', 'avocado'], 'b': ['bean', 'beet'], 'c': ['corn']}.

La lista vacía se crea solo para una etiqueta nueva. Crearla en cada iteración descartaría los miembros anteriores de ese grupo.

Abrevia la inicialización

groups.setdefault(word[0], []).append(word) realiza el mismo paso de agrupación. setdefault devuelve la lista existente si la hay. De lo contrario, almacena la lista vacía proporcionada y la devuelve. El append que sigue modifica esa lista devuelta.

Otra opción crea las listas automáticamente:

from collections import defaultdict
groups = defaultdict(list)
for word in words:
    groups[word[0]].append(word)

Pasa list, la función que crea una lista nueva, sin paréntesis. Al consultar una clave ausente, este defaultdict crea y almacena una lista vacía nueva. Incluso una lectura como groups["z"] inserta esa clave ausente. Usa "z" in groups cuando solo quieras comprobar si un grupo existe.

Mantén las listas independientes

groups = dict.fromkeys(["a", "b"], []) coloca la misma lista bajo ambas claves. Añadir 1 mediante groups["a"] produce entonces {'a': [1], 'b': [1]}. Las listas se comparten, no se copian.

Para empezar con listas independientes, usa {key: [] for key in keys}, setdefault con un [] nuevo o defaultdict(list). Cada categoría nueva debe recibir su propio objeto lista.

Suma importes por categoría

El conteo suma uno por aparición. Un total por categoría suma el importe de cada elemento:

expenses = [("food", 12.5), ("travel", 30),
            ("food", 7.25), ("books", 18)]
totals = {}
for category, amount in expenses:
    totals[category] = totals.get(category, 0) + amount

La categoría de alimentación empieza en 12,5 y después suma 7,25, hasta llegar a 19,75. Los viajes suman 30 y los libros suman 18. Almacenar solo amount sustituiría el total anterior en lugar de añadirle el importe.

Calcula la media o elimina duplicados de un grupo

Para scores = {"A": [80, 90], "B": [70]}, recorre scores.items() y calcula sum(values) / len(values). La media del grupo A es 85,0; la del grupo B es 70,0. Comprueba if values: antes de dividir para tratar por separado un grupo vacío.

Cuando las repeticiones deban desaparecer dentro de cada grupo, usa conjuntos como valores. tags.setdefault(post, set()).add(tag) crea un conjunto para una publicación nueva y añade su etiqueta. Una etiqueta repetida sigue siendo un solo elemento; una lista conservaría cada aparición.

Puntos clave

  • La agrupación asocia una categoría a sus miembros, a menudo en una lista.
  • Crea una lista nueva para cada grupo.
  • setdefault y defaultdict(list) simplifican la inicialización de grupos.
  • Los totales por categoría suman importes; las medias dividen la suma de cada grupo entre su propio número de elementos.
  • Usa conjuntos como valores de los grupos cuando deban desaparecer los miembros repetidos.
4

Modela datos estructurados con diccionarios anidados

Los campos relacionados pertenecen a un mismo registro, y varios registros pueden organizarse por identificador o mantenerse como filas de una lista. Acceder al valor correcto requiere avanzar por cada nivel en orden. Los informes combinan después un bucle externo de registros con consultas de campos o un bucle interno sobre una lista almacenada. Los campos opcionales ausentes, las listas vacías y los objetos internos compartidos afectan a cómo se deben leer, resumir o copiar esos registros.

4.1 Almacena registros y accede a ellos en diccionarios anidados

Un registro reúne campos relacionados, como la edad, la especialidad y las calificaciones de un estudiante. Un diccionario anidado almacena otro diccionario como valor. Las claves externas pueden identificar registros, mientras que las internas identifican campos.

Lee un nivel cada vez
students = {
    "ana": {"age": 19, "major": "math", "grades": [88, 92]},
    "ben": {"age": 22, "major": "history", "grades": [75, 81, 79]},
}

students["ana"] proporciona el diccionario del registro de Ana. Añadir ["major"] lee su especialidad, así que students["ana"]["major"] devuelve 'math'. Para la última calificación de Ben, students["ben"]["grades"][-1] accede al registro, después a su lista y después al último elemento de la lista, 79.

Cada consulta actúa sobre el objeto devuelto por la consulta anterior. La misma sintaxis de corchetes puede representar una clave de diccionario en un nivel y una posición de lista en otro.

Cambia un campo o añade un registro
students["ana"]["age"] = 20
students["ben"]["email"] = "ben@example.com"
students["cara"] = {"age": 21, "major": "art", "grades": []}
students["cara"]["grades"].append(90)

Las dos primeras líneas modifican o añaden campos dentro de registros existentes. La tercera añade un registro completo bajo un identificador nuevo. La cuarta accede a la lista de calificaciones de Cara y le añade una puntuación.

Asignar students["dev"]["age"] = 30 falla porque la consulta externa de "dev" se realiza primero y lanza KeyError: 'dev'. Crea el registro antes de asignar sus campos.

Para una lectura opcional, students.get("dev", {}).get("age") devuelve None. El primer valor predeterminado es un diccionario vacío, así que el segundo get tiene un diccionario que leer incluso cuando el registro no existe. En estos registros, cada valor externo es a su vez un diccionario.

Elige una estructura adecuada para el acceso

Una lista de diccionarios mantiene las filas en orden:

rows = [{"name": "Ana", "city": "Austin"},
        {"name": "Ben", "city": "Denver"}]
print(rows[1]["city"])

Esto imprime Denver: primero el índice de lista y después la clave del campo. Un diccionario de listas, como {"A": [80, 90], "B": [70]}, almacena varios valores por etiqueta. Estas estructuras pueden combinarse cuando un registro necesita tanto campos con nombre como una lista ordenada.

Cuando los nombres identifican las filas de forma única, construye by_name = {row["name"]: row for row in rows}. Después, by_name["Ben"] encuentra directamente la fila de Ben. Los valores son los diccionarios de fila existentes, así que las modificaciones mediante este índice también afectan a esas filas. Si los nombres se repiten, una fila posterior sustituye a una anterior bajo esa clave.

Copia los datos anidados de forma consciente

backup = students comparte el diccionario completo. backup = students.copy() crea un diccionario externo independiente, pero mantiene los mismos registros internos. Después de esa copia superficial, backup["ana"]["age"] = 99 también cambia la edad de Ana en students.

import copy
independent = copy.deepcopy(students)
independent["ana"]["age"] = 25

Para estos diccionarios y listas anidados, la copia profunda también crea objetos internos independientes. Cambiar la edad copiada deja intacta la original. Usa nombres de campo coherentes entre registros para que el mismo código de consulta funcione con cada registro.

Puntos clave

  • Las consultas encadenadas avanzan por una colección cada vez.
  • Crea un diccionario interno antes de asignar un campo dentro de él.
  • Una lista de registros usa primero un índice; un diccionario de registros usa un identificador.
  • Una copia superficial comparte los registros internos; una copia profunda separa los datos mutables anidados.

4.2 Recorre datos anidados con bucles y resúmelos

Procesar datos anidados implica seguir en qué nivel se encuentra el bucle. Un bucle externo elige un registro. Una consulta de campo accede a un valor dentro de ese registro, y un bucle interno puede recorrer después los elementos de una lista almacenada.

Resume un registro por iteración
students = {
    "ana": {"major": "math", "grades": [88, 92]},
    "ben": {"major": "history", "grades": [75, 81, 79]},
    "cara": {"major": "art", "grades": []},
}
for name, info in students.items():
    grades = info["grades"]
    major = info["major"]
    if grades:
        average = sum(grades) / len(grades)
        print(f"{name}: {major}, average {average:.1f}")
    else:
        print(f"{name}: {major}, no grades")

Las calificaciones de Ana suman 180, así que su media es 90,0. El total de Ben es 235 entre tres calificaciones, lo que da aproximadamente 78,33; el formato :.1f muestra 78,3. La lista de Cara está vacía, así que el programa imprime cara: art, no grades sin dividir entre cero.

Asignar grades y major dentro del bucle da a cada nombre los valores del registro actual. La media también debe estar dentro del bucle: hay que calcularla por separado para cada estudiante.

Lee campos opcionales

info.get("email", "no email") proporciona un texto para un campo de correo electrónico opcional. Una consulta directa con info["email"] lanzaría KeyError para un registro que no lo tuviera. El valor predeterminado debe situarse en el nivel donde puede faltar el campo. El get del diccionario externo buscaría identificadores de estudiantes, no campos de correo electrónico.

Selecciona registros
math_students = []
for name, info in students.items():
    if info["major"] == "math":
        math_students.append(name)

Esto produce ['ana']. La condición lee un campo del registro actual; el valor añadido es la clave externa. Si el informe necesitara registros completos, podría añadir info en su lugar. Decide qué tipo de resultado necesita la siguiente parte del programa.

Visita cada calificación almacenada
count = 0
for info in students.values():
    for grade in info["grades"]:
        if grade > 80:
            count += 1

El bucle interno visita el 88 y el 92 de Ana, y después el 75, el 81 y el 79 de Ben. La lista vacía de Cara no añade iteraciones. Tres calificaciones superan 80: 88, 92 y 81. El conteo se inicializa fuera de ambos bucles porque describe a todos los estudiantes en conjunto. Reiniciarlo dentro del bucle externo conservaría solo el conteo del último registro.

Cuenta registros por un campo
majors = {}
for info in students.values():
    major = info["major"]
    majors[major] = majors.get(major, 0) + 1

Cada registro aporta uno a su especialidad. Solo con Ana y Ben, el resultado es {'math': 1, 'history': 1}; incluir a Cara añade 'art': 1. Para sumar o agrupar otro campo, conserva el bucle externo de registros y cambia el valor que aporta.

Para obtener informes legibles, imprime una línea con formato por registro en lugar de todo el diccionario anidado. En una cadena formateada, almacena primero un campo en una variable, como arriba, o usa el tipo de comillas opuesto dentro de las llaves, como en f"{name}: {info['major']}".

Puntos clave

  • Un bucle externo elige un registro; las consultas de campos actúan dentro de él.
  • Comprueba si una lista está vacía antes de dividir entre su longitud.
  • Usa get sobre el registro para un campo opcional.
  • Un bucle interno visita cada elemento de la lista de un registro.
  • Coloca un acumulador fuera de los bucles cuyos resultados combina.
5

Usa conjuntos para eliminar duplicados y comparar colecciones

Los conjuntos se centran en qué valores están presentes. Eliminar duplicados y comparar pertenencias se convierten en operaciones directas, desde encontrar estudiantes inscritos en cursos comunes hasta comprobar qué competencias faltan. El orden y las apariciones repetidas requieren otras colecciones, así que la elección importa antes de convertir los datos. Los conjuntos también se relacionan con los diccionarios: sus claves pueden compararse como conjuntos aunque los valores almacenados sean diferentes.

5.1 Crea conjuntos y elimina duplicados

Un conjunto registra qué valores distintos están presentes. Conserva cada elemento una vez y no tiene un orden garantizado. Los conjuntos son adecuados para comprobar la pertenencia y eliminar duplicados cuando el número de apariciones no importa.

Crea un conjunto
colors = {"red", "green"}
numbers = set([3, 1, 3, 2, 1])
print(len(numbers))
print(sorted(numbers))

Esto imprime 3 y después [1, 2, 3]. Las entradas repetidas se convierten en un solo elemento. Un conjunto vacío es set(); {} crea un diccionario vacío.

set("banana") visita los caracteres de la cadena y deja las letras distintas "a", "b" y "n". {"banana"} proporciona la cadena completa como un elemento. Como ocurre con las claves de diccionario, los valores numéricos iguales cuentan una vez: {1, 1.0, True} tiene un elemento.

Los elementos deben ser aptos para hash. Los números, las cadenas y las tuplas de valores aptos para hash sirven; las listas, los diccionarios y los conjuntos ordinarios no. Usa (1, 2) para un elemento de coordenadas en lugar de [1, 2]. Un frozenset es un conjunto inmutable y puede ser a su vez un elemento de conjunto o una clave de diccionario.

Trabaja sin posiciones

colors[0] lanza TypeError porque un conjunto no tiene posiciones. Su orden de impresión no está garantizado, y los elementos de cadena pueden imprimirse en otro orden en una ejecución distinta. sorted(colors) produce una lista nueva ordenada cuando los elementos se pueden comparar. No asigna un orden al conjunto.

Cambia los miembros
OperaciónQué ocurre
s.add(x)Añade un elemento; un duplicado no tiene efecto.
s.update(items)Añade elementos de un iterable.
s.remove(x)Elimina x; un elemento ausente provoca KeyError.
s.discard(x)Elimina x si está presente; se permite que no exista.
s.pop()Elimina y devuelve un elemento arbitrario.
s.clear()Elimina todos los elementos.

add("blue") añade una cadena. update(["blue", "gold"]) añade dos cadenas. Usar update("blue") añade, en cambio, caracteres separados, porque una cadena es iterable. Los conjuntos no tienen un método append.

Conserva las primeras apariciones cuando sea necesario

list(set(items)) elimina duplicados, pero pierde su orden original. Si las primeras apariciones importan, usa el orden de inserción de los diccionarios:

items = [3, 1, 3, 2, 1]
unique = list(dict.fromkeys(items))
print(unique)

Esto imprime [3, 1, 2]. Los valores se convierten en claves de diccionario, así que cada uno aparece una vez en el orden en que se encontró por primera vez.

También puedes hacer explícitas las funciones de cada colección:

seen = set()
unique = []
for item in items:
    if item not in seen:
        seen.add(item)
        unique.append(item)

El conjunto responde si un elemento ya ha aparecido; la lista conserva las primeras apariciones en orden. Ambas formas requieren elementos de entrada aptos para hash.

Cuenta elementos distintos o comprueba la pertenencia

Para las ocho palabras de "the cat saw the dog the dog ran".split(), len(set(words)) es 5: the, cat, saw, dog y ran. Esto cuenta palabras diferentes, no sus frecuencias.

Un conjunto de remitentes bloqueados permite que sender in blocked responda si una dirección está presente. En colecciones grandes, comprobar la pertenencia en conjuntos y diccionarios suele ser mucho más rápido que buscar en una lista elemento por elemento.

Puntos clave

  • Un conjunto almacena elementos únicos aptos para hash sin un orden garantizado.
  • Usa set() para un conjunto vacío; {} es un diccionario.
  • remove lanza una excepción si el elemento no existe; discard permite que esté ausente.
  • sorted(s) devuelve una lista; los elementos de un conjunto no tienen posiciones.
  • list(dict.fromkeys(items)) elimina repeticiones y conserva las primeras apariciones.
  • len(set(items)) cuenta valores distintos.

5.2 Compara colecciones con operaciones de conjuntos

Las operaciones de conjuntos expresan preguntas sobre la pertenencia a dos colecciones. Usa la operación que corresponda a la pregunta: cualquier miembro de cualquiera de las colecciones, solo los miembros compartidos o los miembros que quedan tras las exclusiones.

Lee las cuatro operaciones

Supón que las inscripciones en los cursos son:

python = {"Ana", "Ben", "Cara", "Dev"}
sql = {"Ben", "Dev", "Eli"}
ExpresiónRegla de pertenenciaMiembros, en orden alfabético
`pythonsql`En cualquiera de los conjuntos o en ambos
python & sqlEn ambos conjuntosBen, Dev
python - sqlEn Python, pero no en SQLAna, Cara
python ^ sqlEn exactamente un conjuntoAna, Cara, Eli

La unión incluye a los cinco estudiantes una vez. La intersección conserva solo a los dos estudiantes compartidos. La diferencia parte del conjunto de la izquierda y excluye todo lo que esté en el de la derecha. Invertir la diferencia cambia la pregunta: sql - python contiene solo a Eli. La diferencia simétrica conserva las dos partes que no se solapan; equivale a la unión menos la intersección.

Las formas con métodos son python.union(sql), python.intersection(sql), python.difference(sql) y python.symmetric_difference(sql).

Comprueba una relación

a <= b pregunta si todos los miembros de a pertenecen a b. Esa es la comprobación de subconjunto. a < b exige además que b tenga al menos un miembro adicional, lo que convierte a a en un subconjunto propio. a >= b y a > b comprueban las relaciones de superconjunto correspondientes.

print({"Ben"} <= sql)
print(sql <= sql)
print(sql < sql)
print(python.isdisjoint(sql))

Esto imprime True, True, False y False. Un conjunto es subconjunto de sí mismo, pero no subconjunto propio de sí mismo. Los conjuntos disjuntos no tienen ningún miembro compartido; Python y SQL comparten a Ben y Dev. Los métodos issubset e issuperset también devuelven resultados booleanos.

Mantén los resultados separados o modifica un conjunto

result = a | b crea un conjunto nuevo y deja ambas entradas sin cambios. Las formas a |= b, a &= b, a -= b y a ^= b modifican el objeto a original para que contenga la unión, la intersección, la diferencia o la diferencia simétrica. Cualquier otro nombre que haga referencia a ese mismo conjunto refleja el cambio.

Los métodos de conjuntos aceptan iterables como las listas. python.union(["Fay"]) funciona. Los operadores ordinarios de conjuntos requieren operandos de tipo conjunto: {"a"} | ["b"] lanza TypeError.

Usa | para combinar conjuntos, no +. Distingue también & de and: {1, 2} and {3} devuelve {3} porque el conjunto de la izquierda se considera verdadero (truthy). No calcula los miembros comunes.

Encuentra los requisitos que faltan
required = {"python", "sql", "git"}
skills = {"python", "excel", "git"}
missing = required - skills
extra = skills - required
qualified = required <= skills

El conjunto de competencias que faltan contiene "sql"; el de competencias adicionales contiene "excel". La intersección contiene "git" y "python". qualified es False porque falta al menos una competencia obligatoria. Una persona candidata puede tener muchas competencias y aun así no superar la comprobación de subconjunto: todos los miembros requeridos deben estar presentes.

Puntos clave

  • | toma los elementos de cualquiera de los conjuntos, & los de ambos y ^ los de exactamente uno.
  • a - b conserva solo los miembros de a que no están en b.
  • <= permite conjuntos iguales; < exige un subconjunto propio.
  • isdisjoint comprueba si no hay miembros compartidos.
  • Los operadores ordinarios de conjuntos crean resultados; las formas que actúan sobre el objeto original modifican el conjunto de la izquierda.

5.3 Elige la colección adecuada para una tarea

Elige una colección según la tarea que deba realizar el programa con ella. El orden, las repeticiones, la consulta por nombre y la posibilidad de modificarla son necesidades distintas. Un programa puede usar varios tipos de colecciones porque las diferentes partes de sus datos cumplen funciones distintas.

Compara las colecciones incorporadas
TipoCómo accedes a los datosOrden y repeticiones¿Se puede modificar la colección?
ListaPor posiciónCon orden; permite repeticionesSí
TuplaPor posiciónCon orden; permite repeticionesNo
DiccionarioPor claveOrden de inserción; claves únicasSí
ConjuntoPor pertenenciaSin orden garantizado; elementos únicosSí

Una lista es adecuada para una secuencia de eventos: el orden importa y el mismo evento puede ocurrir más de una vez. Una tupla es adecuada para un grupo fijo de valores relacionados, como unas coordenadas. Una tupla puede contener un objeto mutable, así que sus posiciones fijas no hacen inmutables todos los objetos que contiene. Solo una tupla de elementos aptos para hash puede ser una clave de diccionario o un elemento de conjunto.

Un diccionario es adecuado para información con nombre: un identificador lleva a un registro o el nombre de un producto lleva a una cantidad. Sus valores pueden repetirse y pueden ser colecciones completas. Un conjunto es adecuado para una pregunta de pertenencia: el programa necesita saber si un identificador está presente, no un valor separado asociado a él.

Conserva la información que necesita la tarea

Convertir [1, 2, 1] en un conjunto pierde tanto la aparición repetida como la secuencia. Esto resulta útil para una lista de elementos distintos, pero es incorrecto para un registro completo de eventos. Un diccionario como {"reader": True, "editor": True} puede convertirse a menudo en {"reader", "editor"} cuando los valores no aportan información adicional. Si cada rol necesita un nivel de permisos, conserva el diccionario.

La igualdad sigue el significado de cada colección. [1, 2] == [2, 1] es False porque el orden de la secuencia es distinto. {1, 2} == {2, 1} es True. Los diccionarios con pares clave-valor iguales son iguales al compararlos aunque las claves se hayan insertado en órdenes diferentes. Su orden de inserción afecta a la iteración, no a esa prueba de igualdad.

Compara claves de diccionario como conjuntos
store_a = {"pens": 10, "pads": 4, "ink": 2}
store_b = {"pads": 7, "clips": 30, "ink": 5}
common = store_a.keys() & store_b.keys()
only_a = store_a.keys() - store_b.keys()

Las claves comunes son "ink" y "pads"; only_a contiene "pens". Son los productos que se venden, independientemente de sus cantidades. Las dos tiendas tienen distintas cantidades de tinta, pero la tinta sigue siendo una clave compartida.

Las vistas de claves de diccionario admiten operaciones de conjuntos porque las claves son únicas y aptas para hash. Las vistas de valores no admiten estos operadores: store_a.values() & {1} lanza TypeError. Es posible convertir los valores en un conjunto cuando son aptos para hash, pero eso descarta los valores repetidos y plantea una pregunta distinta de comparar las claves de productos.

Combina estructuras en un programa

Una biblioteca puede usar un diccionario de identificadores de libros asociados a diccionarios de registro, un conjunto de identificadores de libros actualmente prestados y una lista de los préstamos de hoy en orden cronológico. Una tupla como ("Dune", 1965) mantiene juntos un título y un año. El diccionario encuentra los detalles de un libro; el conjunto comprueba si está prestado; la lista conserva el historial del día.

Puntos clave

  • Usa diccionarios para consultar por nombre o identificador y conjuntos para registrar la pertenencia sin repeticiones.
  • Usa listas para secuencias ordenadas y modificables, y tuplas para grupos fijos.
  • La igualdad de listas depende del orden; la de diccionarios y conjuntos no.
  • Las operaciones de conjuntos con vistas de claves comparan las claves, no los valores almacenados bajo ellas.

Ejemplos de Diccionarios y conjuntos en Python

5 Lecciones Interactivas

1

Construye y mantén un diccionario de existencias

14 pasos
Crea pares clave-valor, elige consultas seguras y sigue los cambios y las fusiones de inventario.
  1. 1
    IntroducciónEncuentra información por un nombre

    Un inventario necesita conectar el nombre de un producto con su cantidad. Un diccionario almacena esa relación como un par clave-valor: el nombre es la clave y la cantidad es el valor.

    Construirás un inventario pequeño, decidirás qué significa un producto ausente y seguirás los cambios en productos existentes y nuevos. Lleva por separado dos aspectos: si una clave existe y qué valor almacena.

  2. 2
    EjemploEscribe el primer inventario
    stock = {"pens": 10, "pads": 4}
    

    Cada signo de dos puntos une una clave con su valor, y la coma separa los pares. stock["pens"] lee 10; len(stock) es 2, el número de pares.

    La clave identifica el producto. stock[0] buscaría la clave 0, no el primer producto. Aunque los diccionarios conservan el orden de inserción, se sigue accediendo a sus entradas mediante claves.

  3. 3
    ExplicaciónElige claves que Python pueda almacenar

    Las claves deben ser aptas para hash. Las cadenas y los números sirven, al igual que las tuplas que solo contienen elementos aptos para hash. Una ubicación como (2, 3) puede ser una clave, mientras que la lista [2, 3] no.

    Los valores pueden ser de cualquier tipo, incluidas listas o diccionarios. Esta regla se aplica a la clave, así que almacenar una lista como valor no impide que el par sea válido.

  4. 4
    DesafíoCuenta los pares almacenados

    ¿Cuál es la longitud de {"pens": 10, "pads": 4, "pens": 7} y qué valor se almacena para "pens"?

    ---reveal---

    La longitud es 2 y los bolígrafos tienen el valor 7. El par posterior sustituye el valor anterior bajo la misma clave. No crea una segunda entrada de bolígrafos. Distintas claves pueden compartir un valor, pero una clave no puede contener dos pares separados.

  5. 5
    ExplicaciónDecide qué significa la ausencia

    stock["clips"] lanza KeyError porque el inventario actual no tiene una clave de clips. Usa la consulta directa cuando un registro sea obligatorio y su ausencia requiera atención.

    En cambio, stock.get("clips", 0) devuelve el valor alternativo cero sin añadir clips. Eso sirve para un cálculo en el que un producto ausente deba contar como si no hubiera existencias almacenadas. El diccionario sigue teniendo dos entradas después de esta llamada.

  6. 6
    Idea claveUn cero almacenado sigue teniendo una clave

    Supón que stock["pads"] = 0 registra que los blocs están agotados. "pads" in stock sigue siendo True porque el registro existe.

    if stock.get("pads"): omite la rama porque cero se considera falso. Esa prueba no puede distinguir un producto agotado de un registro ausente que devuelve None. Cuando la pregunta sea si un registro existe, comprueba la clave con in.

  7. 7
    DesafíoMantén visibles los productos agotados

    A partir de stock = {"pens": 10, "pads": 0}, un informe debe mostrar la cantidad de blocs e imprimir "missing" para un producto ausente. ¿Qué prueba debe decidir si se lee stock[item]?

    ---reveal---

    Usa if item in stock:. Los blocs cumplen esa prueba y se muestra cero. En la rama else, imprime "missing". Una prueba del valor de verdad de la cantidad devuelta trataría incorrectamente el registro del producto agotado como ausente.

  8. 8
    EjemploAplica una venta y una entrega

    Empieza un inventario nuevo:

    stock = {"pens": 10, "pads": 4}
    stock["pens"] -= 3
    stock["clips"] = 50
    

    La venta lee la cantidad anterior de bolígrafos y almacena 7. La entrega crea una clave nueva de clips con el valor 50. La línea con -= requiere que la clave de bolígrafos ya exista; una asignación simple puede crear una clave ausente. Un diccionario no tiene un método append.

  9. 9
    EjemploRecupera una cantidad eliminada

    Continúa con el inventario:

    removed = stock.pop("pads")
    

    removed pasa a ser 4 y el diccionario pasa a ser {"pens": 7, "clips": 50}. pop modifica la colección y también devuelve el valor eliminado.

    Usa del stock["pads"] cuando solo necesites eliminar. Ambas formas lanzan KeyError si la clave no existe, salvo que pop reciba un valor predeterminado, como en stock.pop("pads", 0).

  10. 10
    DesafíoTrata una segunda eliminación

    El inventario actual es {"pens": 7, "clips": 50}. ¿Qué devuelve stock.pop("pads", 0) y qué ocurre con el inventario?

    ---reveal---

    Devuelve 0 y deja el inventario sin cambios porque los blocs ya no están. El valor predeterminado evita un error de clave ausente; no crea un par de blocs. Si la clave existiera, se eliminaría y se devolvería su valor almacenado.

  11. 11
    ExplicaciónFusiona configuraciones sin perder la base

    Para dos diccionarios, base | overrides crea un resultado nuevo y da prioridad al lado derecho para las claves compartidas:

    base = {"size": 2, "color": "blue"}
    result = base | {"size": 5}
    

    result tiene tamaño 5 y color "blue"; base sigue teniendo tamaño 2. Este operador está disponible desde Python 3.9. En cambio, base.update(overrides) modificaría la base y devolvería None.

  12. 12
    ConsejoSigue el orden a través de los cambios

    Sustituir un valor mantiene su clave en su lugar. Eliminar una clave y volver a añadirla la coloca al final. popitem() elimina el último par insertado, no el valor máximo.

    Distingue también los valores de retorno de los métodos: update() y clear() devuelven None, mientras que pop() devuelve un valor. No asignes el resultado de una actualización al nombre que necesitas para el diccionario.

  13. 13
    DesafíoUsa un valor predeterminado sin sobrescribir

    Un programa empieza con stock = {"pens": 7}. Llama a stock.get("clips", 20), después a stock.setdefault("clips", 5) y luego suma 2 a stock["clips"]. ¿Cuál es la cantidad final de clips?

    ---reveal---

    Es 7. get devuelve 20, pero no inserta nada. Después, setdefault crea los clips con 5 y la actualización final suma 2. Un valor predeterminado de consulta no es un valor almacenado a menos que una operación lo inserte.

  14. 14
    RepasoSigue la clave y el valor

    Construye un diccionario a partir de pares clave-valor y después elige de forma consciente el comportamiento de la consulta: acceso directo para registros obligatorios, in para la existencia y get para un valor alternativo.

    Las asignaciones añaden o sustituyen. Los métodos de eliminación pueden devolver datos útiles, y la fusión puede crear un diccionario nuevo o modificar uno existente. Al seguir la ejecución del código, registra cada inserción, sustitución de valor y eliminación en orden.

2

Convierte los datos de diccionarios en informes

12 pasos
Elige las entradas de los bucles, ordena por claves o valores y construye diccionarios filtrados o transformados.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónElige qué recibe cada bucle
  2. 2
    EjemploRecibe ambas partes de un par
  3. 3
    Idea claveUna vista mantiene la conexión
  4. 4
    EjemploOrdena por un valor almacenado
  5. 5
    DesafíoMantén los nombres en orden de valor
  6. 6
    EjemploConstruye un diccionario con un bucle
  7. 7
    ConexiónExpresa la misma regla de forma compacta
  8. 8
    EjemploFiltra primero y después produce el par
  9. 9
    DesafíoCombina un filtro y una transformación
  10. 10
    ConsejoComprueba los pares antes de construir
  11. 11
    DesafíoElimina entradas bajas sin alterar el bucle
  12. 12
    RepasoAjusta la entrada al resultado
3

Construye conteos, grupos y totales por categoría

13 pasos
Sigue las primeras apariciones, conserva los miembros de los grupos y calcula resultados para cada categoría.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónHaz que cada categoría acumule un resultado
  2. 2
    EjemploDa a un elemento nuevo su primer conteo
  3. 3
    EjemploUsa cero para un elemento aún no visto
  4. 4
    DesafíoEncuentra por qué un conteo nunca aumenta
  5. 5
    ConsejoNormaliza antes de elegir la clave
  6. 6
    ExplicaciónConserva los miembros de cada grupo
  7. 7
    EjemploSigue una actualización de un valor de tipo lista
  8. 8
    Idea claveCada grupo necesita una lista independiente
  9. 9
    DesafíoPredice la creación automática de un grupo
  10. 10
    EjemploSuma importes en lugar de apariciones
  11. 11
    EjemploCalcula la media de los valores de cada grupo
  12. 12
    DesafíoElige qué aporta cada registro
  13. 13
    RepasoConserva el resultado entre iteraciones
4

Lee y resume registros anidados

11 pasos
Sigue consultas encadenadas, copia registros de forma consciente y genera informes a partir de listas almacenadas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDistingue los identificadores de registro de los campos
  2. 2
    EjemploSigue la ruta hasta una puntuación
  3. 3
    DesafíoAñade un campo a un registro nuevo
  4. 4
    Idea claveCopiar el exterior puede mantener compartido el interior
  5. 5
    DesafíoMantén independientes las calificaciones de prueba
  6. 6
    EjemploCalcula una media por registro
  7. 7
    ConsejoTrata un registro sin calificaciones
  8. 8
    ConexiónLee los campos en el nivel del registro
  9. 9
    EjemploVisita todas las calificaciones de los registros
  10. 10
    DesafíoCombina un campo y una lista almacenada
  11. 11
    RepasoMantén visible cada nivel
5

Compara la pertenencia y elige colecciones

15 pasos
Elimina repeticiones, usa operaciones de conjuntos y combina conjuntos con registros y secuencias ordenadas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónPregunta quién pertenece a cada colección
  2. 2
    ExplicaciónRegistra la pertenencia sin duplicados
  3. 3
    ConsejoAñade y elimina el elemento previsto
  4. 4
    EjemploConserva las primeras apariciones
  5. 5
    DesafíoConserva la secuencia original de etiquetas distintas
  6. 6
    EjemploEncuentra a todos o solo a los estudiantes compartidos
  7. 7
    EjemploLee la diferencia de izquierda a derecha
  8. 8
    DesafíoEncuentra a quienes pertenecen a exactamente un club
  9. 9
    ExplicaciónComprueba todos los requisitos
  10. 10
    Idea claveDistingue un resultado de un conjunto modificado
  11. 11
    ConexiónConserva el historial, la identidad y la pertenencia
  12. 12
    EjemploCompara claves sin comparar cantidades
  13. 13
    DesafíoElige una colección para un registro que crece
  14. 14
    DesafíoCombina vistas de claves con una comprobación de registros ausentes
  15. 15
    RepasoElige primero la pregunta de pertenencia

Ejercicios de Diccionarios y conjuntos en Python

40 Preguntas de Práctica en 4 sets

Set 1: Lee y modifica colecciones de Python10 Preguntas de Práctica

Pregunta 1 de 10

¿Cuántos elementos hay en {"oak": 4, "pine": 7, "oak": 9}?
  1. 3
  2. 2
  3. 4
  4. 6
Mostrar respuestaOcultar respuesta
Respuesta: B
La clave repetida "oak" conserva su último valor, 9, así que el diccionario tiene las dos claves "oak" y "pine". Contar los tres pares escritos pasa por alto la sustitución: un diccionario no puede contener dos entradas separadas bajo la misma clave. El número de elementos es el número de claves distintas.

Pregunta 2 de 10

Para levels = {"east": 0, "west": 5}, ¿qué devuelve "east" in levels?
  1. False
  2. 0
  3. None
  4. True
Mostrar respuestaOcultar respuesta
Respuesta: D
La pertenencia comprueba si "east" es una clave, y está presente con un valor almacenado de cero. Un valor cero hace que una prueba de su valor de verdad sea falsa, pero no elimina la clave. El resultado de in es un booleano, no el valor almacenado bajo la clave.

Pregunta 3 de 10

¿Qué imprime este código?

seats = {"front": 6, "back": 8}
removed = seats.pop("front")
seats["back"] -= 2
print(removed, seats["back"])
  1. 6 6
  2. 6 8
  3. None 6
  4. 0 6
Mostrar respuestaOcultar respuesta
Respuesta: A
pop("front") elimina el par y devuelve su valor, así que removed pasa a ser 6. El conteo restante de asientos traseros baja de 8 a 6. Tratar pop como un método que devuelve None lo confunde con métodos como clear, que modifican una colección sin devolver un elemento.

Pregunta 4 de 10

¿Qué devuelve sum({"small": 3, "large": 9}.values())?
  1. 2
  2. 9
  3. 12
  4. 6
Mostrar respuestaOcultar respuesta
Respuesta: C
La vista de valores proporciona los números 3 y 9, y sum los suma para obtener 12. Que haya dos pares clave-valor no hace que la suma sea 2; eso sería la longitud del diccionario. Llamar a .values() selecciona las cantidades que necesita el cálculo.

Pregunta 5 de 10

¿Qué diccionario crea {name: len(name) for name in ["elm", "cedar"]}?
  1. {3: 'elm', 5: 'cedar'}
  2. {'elm': 5, 'cedar': 3}
  3. {'elm': 3, 'cedar': 5}
  4. {'elm': 1, 'cedar': 1}
Mostrar respuestaOcultar respuesta
Respuesta: C
La expresión anterior a los dos puntos proporciona cada clave, así que los nombres siguen siendo claves. len(name) proporciona el valor correspondiente: 3 para "elm" y 5 para "cedar". Invertir los pares requeriría colocar la expresión de longitud antes de los dos puntos y la expresión del nombre después.

Pregunta 6 de 10

¿Cuál es el valor de counts["up"] después de este bucle?

counts = {}
for move in ["up", "left", "up", "up"]:
    counts[move] = counts.get(move, 0) + 1
  1. 3
  2. 1
  3. 2
  4. 4
Mostrar respuestaOcultar respuesta
Respuesta: A
El primer "up" almacena 1, el segundo lo aumenta a 2 y el tercero lo aumenta a 3. La entrada "left" tiene su propio contador y no aumenta "up". Contar las cuatro iteraciones del bucle daría el número total de movimientos, no la frecuencia de este movimiento concreto.

Pregunta 7 de 10

¿Cuál es el valor de groups["r"] después de este código?

groups = {}
for word in ["rose", "mint", "reed"]:
    groups.setdefault(word[0], []).append(word)
  1. ['reed']
  2. ['rose', 'mint', 'reed']
  3. ['r', 'r']
  4. ['rose', 'reed']
Mostrar respuestaOcultar respuesta
Respuesta: D
La primera palabra crea la lista "r" y añade "rose"; más tarde, "reed" se incorpora a esa misma lista. El grupo "m" contiene "mint" por separado. setdefault conserva una lista existente, así que no la sustituye por una lista vacía nueva en la última iteración.

Pregunta 8 de 10

Para devices = {"d7": {"ports": [2, 4, 8]}}, ¿qué devuelve devices["d7"]["ports"][-1]?
  1. 2
  2. 8
  3. 4
  4. 3
Mostrar respuestaOcultar respuesta
Respuesta: B
La primera consulta selecciona el registro del dispositivo, la segunda selecciona su lista de puertos y [-1] selecciona el último elemento de la lista, 8. Una clave de diccionario y un índice de lista cumplen funciones distintas dentro de la cadena. La longitud de la lista es 3, pero la expresión solicita un elemento, no su longitud.

Pregunta 9 de 10

¿Qué devuelve len(set([8, 2, 8, 5, 2]))?
  1. 2
  2. 4
  3. 3
  4. 5
Mostrar respuestaOcultar respuesta
Respuesta: C
El conjunto contiene los tres números distintos 8, 2 y 5. Las apariciones repetidas no crean elementos nuevos, así que la longitud es 3. La lista de entrada tiene cinco posiciones, pero convertirla en un conjunto descarta las apariciones adicionales antes de evaluar len.

Pregunta 10 de 10

Un servicio requiere {"read", "write"}. Una cuenta tiene {"read", "share"} y una nueva concesión añade {"write"}. ¿Qué expresión comprueba si la cuenta cumple todos los requisitos después de la concesión?
  1. required <= (current | grant)
  2. required <= (current & grant)
  3. required >= (current | grant)
  4. required < (current & grant)
Mostrar respuestaOcultar respuesta
Respuesta: A
La unión añade la concesión a los permisos actuales y produce los permisos de lectura, uso compartido y escritura. Después, la comprobación de subconjunto verifica que todos los permisos requeridos pertenezcan a ese conjunto combinado. La intersección solo conservaría los permisos que ya estuvieran presentes en ambas entradas, que aquí son disjuntas, así que descartaría la nueva concesión en lugar de añadirla.
Set 2: Sigue consultas, grupos y registros10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Después de rates = {"basic": 7} y result = rates.get("plus", 0), ¿cuáles son los valores de result y len(rates)?
  1. 0 y 2
  2. None y 1
  3. 0 y 1
  4. 7 y 1
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Qué imprime este código?

settings = {"sound": 2, "light": 4}
settings.update({"sound": 5})
del settings["sound"]
settings["sound"] = 1
print(list(settings))
  1. ['light', 'sound']
  2. ['sound', 'light']
  3. ['light']
  4. ['sound', 'light', 'sound']
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Para wait = {"A": 9, "B": 3, "C": 6}, ¿qué devuelve sorted(wait, key=wait.get)?
  1. ['A', 'B', 'C']
  2. ['B', 'C', 'A']
  3. ['A', 'C', 'B']
  4. [3, 6, 9]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

¿Qué imprime este código?

from collections import Counter
counts = Counter([4, 4, 7])
print(counts[9])
  1. None
  2. 1
  3. KeyError: 9
  4. 0
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

¿Qué imprime este código?

groups = dict.fromkeys(["indoor", "outdoor"], [])
groups["indoor"].append(12)
groups["outdoor"].append(18)
print(groups["indoor"])
  1. [12]
  2. [18]
  3. [[12], [18]]
  4. [12, 18]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

¿Qué imprime este código?

original = {"r1": {"visits": 2}}
backup = original.copy()
backup["r1"]["visits"] += 3
backup["r2"] = {"visits": 1}
print(original["r1"]["visits"], "r2" in original)
  1. 2 False
  2. 5 False
  3. 5 True
  4. 2 True
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Un registro contiene {"scores": []}. ¿Qué condición debe proteger sum(scores) / len(scores) después de scores = record["scores"]?
  1. if scores:
  2. if "scores" in record:
  3. if scores is not None:
  4. if len(scores) >= 0:
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

¿Qué llamada a un método elimina "paused" de states y permite que no esté presente?
  1. states.remove("paused")
  2. states.pop("paused")
  3. states.discard("paused")
  4. states.clear("paused")
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Para morning = {"Ivo", "June", "Kai"} y evening = {"June", "Mina"}, ¿cuáles son los miembros de morning ^ evening?
  1. Ivo, June, Kai, Mina
  2. Ivo, Kai, Mina
  3. June
  4. Ivo, Kai
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un sistema de supervisión debe conservar cada lectura de sensor en orden de llegada, incluidas las repeticiones, y comprobar por separado si cada identificador de sensor está autorizado. ¿Qué par de colecciones es más adecuado?
  1. Una lista de lecturas y un conjunto de identificadores autorizados.
  2. Un conjunto de lecturas y una lista de identificadores autorizados.
  3. Un diccionario con las lecturas como claves y un conjunto de identificadores autorizados.
  4. Una tupla de lecturas y un diccionario con las lecturas como claves.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 3: Depura transformaciones de colecciones10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

¿Cuál es el valor de len({1: "first", True: "second", "1": "third"})?
  1. 1
  2. 3
  3. 6
  4. 2
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un informe de existencias debe imprimir una cantidad almacenada, incluido cero, o "missing" cuando no exista la clave del producto. ¿Qué cuerpo de función cumple ese requisito?
  1. if stock.get(product):
        return stock[product]
    return "missing"
    
  2. if product in stock:
        return stock[product]
    return "missing"
    
  3. return stock.get(product) or "missing"
    
  4. if product in stock.values():
        return stock[product]
    return "missing"
    
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

¿Qué diccionario queda después de esta inversión?

team = {"Luz": "design", "Omar": "support", "Pia": "design"}
by_role = {role: name for name, role in team.items()}
  1. {'design': 'Pia', 'support': 'Omar'}
  2. {'design': ['Luz', 'Pia'], 'support': ['Omar']}
  3. {'design': 'Luz', 'support': 'Omar'}
  4. {'Luz': 'design', 'Omar': 'support', 'Pia': 'design'}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Después de contar las palabras de "Go go! Stop." usando lower().split() y word.strip(".,!?"), ¿cuál es el conteo de "go"?
  1. 2
  2. 1
  3. 3
  4. 0
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Un bucle de totales procesa [("repair", 14), ("delivery", 6), ("repair", 9)]. Con totals[category] = totals.get(category, 0) + amount, ¿cuál es el valor de totals["repair"]?
  1. 9
  2. 14
  3. 23
  4. 29
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un diccionario contiene registros como valores de tipo diccionario. ¿Qué devuelve records.get("x9", {}).get("email", "none") cuando "x9" no existe?
  1. {}
  2. None
  3. KeyError: 'x9'
  4. "none"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

¿Qué imprime este código?

records = {"a": {"scores": [6, 9]}, "b": {"scores": [8]},
           "c": {"scores": []}}
count = 0
for info in records.values():
    for score in info["scores"]:
        if score >= 8:
            count += 1
print(count)
  1. 0
  2. 1
  3. 2
  4. 3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

¿Qué devuelve list(dict.fromkeys(["z", "m", "z", "a"]))?
  1. ['a', 'm', 'z']
  2. ['z', 'm', 'a']
  3. ['z', 'm', 'z', 'a']
  4. ['m', 'z', 'a']
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

¿Qué devuelve {2, 5} < {2, 5}?
  1. True
  2. False
  3. set()
  4. None
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

¿Qué imprime este código?

first = {"lamp": 4, "cord": 9, "plug": 2}
second = {"cord": 3, "plug": 8, "case": 5}
result = {name: first[name]
          for name in first.keys() & second.keys()
          if first[name] < second[name]}
print(sorted(result.items()))
  1. [('cord', 9)]
  2. [('plug', 8)]
  3. [('cord', 9), ('plug', 2)]
  4. [('plug', 2)]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 4: Combina técnicas de colecciones10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Una cuadrícula almacena valores por pares de coordenadas. ¿Qué clave puede aceptar Python directamente?
  1. [3, 5]
  2. (3, 5)
  3. {3, 5}
  4. {"x": 3, "y": 5}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Qué imprime este código?

stock = {"bolts": 0}
first = stock.get("nuts", 4)
second = stock.setdefault("nuts", 6)
print(first, second, len(stock))
  1. 4 4 2
  2. 4 6 1
  3. 4 6 2
  4. 6 6 2
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

¿Qué imprime este código?

base = {"size": 2, "mode": 1}
alias = base
merged = base | {"size": 5}
alias["mode"] = 3
print(merged["size"], merged["mode"], base["size"])
  1. 5 3 5
  2. 5 3 2
  3. 2 1 2
  4. 5 1 2
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

¿Qué imprime este código?

levels = {"low": 2, "high": 8, "mid": 5}
view = levels.keys()
for name in list(levels):
    if levels[name] < 5:
        del levels[name]
print(list(view))
  1. ['low', 'high', 'mid']
  2. ['high', 'mid']
  3. ['mid', 'high']
  4. ['low']
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

¿Qué produce este código?

names = ["Rae", "Sol", "Tia"]
scores = [7, 9]
result = {name: score * 2 for name, score in zip(names, scores)
          if score >= 8}
  1. {'Sol': 18}
  2. {'Rae': 14, 'Sol': 18}
  3. {'Sol': 9}
  4. {'Sol': 18, 'Tia': 18}
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

¿Qué imprime este código?

from collections import defaultdict
groups = defaultdict(list)
groups["red"].append(5)
unused = groups["blue"]
print(len(groups), len(unused))
  1. 1 0
  2. 2 1
  3. 1 1
  4. 2 0
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

¿Qué media global producen estos datos cuando todas las puntuaciones tienen el mismo peso?

records = {"p": {"scores": [10, 20]},
           "q": {"scores": [90]}, "r": {"scores": []}}
  1. 40.0
  2. 52.5
  3. 60.0
  4. 30.0
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

¿Qué imprime este código?

records = {"v1": {"team": "north", "scores": [2, 6]},
           "v2": {"team": "south", "scores": []},
           "v3": {"team": "north", "scores": [4]}}
totals = {}
for info in records.values():
    team = info["team"]
    for score in info["scores"]:
        totals[team] = totals.get(team, 0) + score
print(totals.get("south", 0), totals["north"])
  1. 0 4
  2. 1 12
  3. 0 12
  4. 0 8
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

¿Qué imprime este código?

required = {"a", "b", "c"}
current = {"a", "d"}
missing = required - current
current |= {"b"}
print(sorted(missing), sorted(required - current))
  1. ['c'] ['c']
  2. ['b', 'c'] ['b', 'c']
  3. ['b', 'c'] ['c']
  4. ['d'] ['c']
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

¿Qué imprime este código?

left = {"x": 2, "y": 4}
right = {"y": 4, "x": 2}
print(left == right, list(left) == list(right))
  1. True False
  2. True True
  3. False True
  4. False False
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

62 Términos Clave, cada uno con su definición

A

Actualización
Una actualización copia pares en un diccionario existente, añade claves nuevas y sustituye los valores de las claves que ya existen.
Llamar a stock.update({"soap": 6}) realiza una actualización y devuelve None, no el diccionario actualizado.
Acumulador
Un acumulador es una variable que reúne un resultado a lo largo de las iteraciones de un bucle, como una suma acumulada o un conteo de entradas que cumplen una condición.
Un acumulador inicializado antes del bucle de calificaciones puede contar a todos los estudiantes que alcanzan la puntuación para aprobar.
Agrupación
La agrupación reúne entradas bajo etiquetas de categoría compartidas y suele asociar cada etiqueta a una lista de todos los miembros que se le asignan.
Agrupar nombres de archivo por su primera letra coloca "map" y "memo" en la misma lista "m".
Apto para hash
Un objeto es apto para hash cuando puede servir como clave de diccionario o elemento de conjunto; las cadenas, los números y las tuplas de elementos aptos para hash cumplen este requisito.
La tupla (4, 7) es apta para hash y puede identificar una ubicación en una cuadrícula, mientras que la lista [4, 7] no.

B

Bucle anidado
Un bucle anidado ejecuta un bucle interno durante cada iteración de un bucle externo, como al visitar cada puntuación dentro de cada registro.
Un bucle anidado sobre estudiantes y sus calificaciones puede contar las calificaciones que cumplen una condición en toda la clase.

C

Campo opcional
Un campo opcional puede estar ausente en algunos registros, por lo que leerlo con get permite proporcionar un valor alternativo sin lanzar KeyError.
Un campo opcional de correo electrónico puede mostrarse como "no email" cuando un registro de estudiante no lo contiene.
Clave
Una clave identifica un valor en un diccionario; usar la clave recupera ese valor sin depender de la posición del par.
La clave "glue" recupera la cantidad 3 de un diccionario que almacena cantidades por nombre de producto.
Clave de comparación
Una clave de comparación es el valor producido por la función pasada como key=, que se usa para comparar elementos mientras los resultados conservan los elementos originales.
Con sorted(wait, key=wait.get), cada tiempo de espera almacenado es la clave de comparación del nombre de su estación.
Comprobación de lista no vacía
Una comprobación de lista no vacía verifica que una lista contenga valores antes de una operación que los necesite, como dividir una suma entre la longitud de la lista.
La comprobación de lista no vacía if scores: evita que un registro sin puntuaciones provoque una división entre cero.
Comprobación de pertenencia
Una comprobación de pertenencia usa in o not in para preguntar si una colección contiene un elemento; en un diccionario comprueba las claves.
La comprobación de pertenencia "soap" in stock sigue siendo verdadera cuando la cantidad de jabón almacenada es cero.
Conjunto
Un conjunto es una colección mutable de elementos únicos aptos para hash sin un orden garantizado, que se usa para comprobar la pertenencia y comparar colecciones.
Un conjunto de identificadores de libros prestados responde si un identificador está presente sin almacenar un valor separado para él.
Conjunto inmutable (frozenset)
Un conjunto inmutable es un conjunto cuya aptitud para hash le permite servir como clave de diccionario o como elemento de otro conjunto.
Un frozenset puede representar un grupo fijo de etiquetas cuando todo ese grupo deba usarse como clave de diccionario.
Conjuntos disjuntos
Los conjuntos disjuntos no comparten ningún elemento, así que su intersección está vacía y llamar a a.isdisjoint(b) devuelve True.
Los conjuntos de resultados impares y pares de un dado son disjuntos porque ningún resultado posible pertenece a ambos.
Consulta encadenada
Una consulta encadenada aplica varios accesos en secuencia, cada uno al objeto devuelto por el acceso anterior a un diccionario o una lista.
La consulta encadenada devices["d7"]["ports"][0] accede a un registro, a su lista de puertos y después al primer puerto.
Consulta por clave
Una consulta por clave en un diccionario usa una clave para recuperar su valor asociado; la consulta con corchetes lanza un error cuando esa clave no existe.
La consulta prices["juice"] recupera el precio almacenado, siempre que el diccionario tenga una clave "juice".
Copia profunda
Una copia profunda copia recursivamente las colecciones anidadas y crea diccionarios y listas independientes que se pueden modificar sin afectar al original.
Una copia profunda permite a un programa probar puntuaciones nuevas en un registro copiado sin modificar la lista de puntuaciones original.
Copia superficial
Una copia superficial crea una colección externa independiente y reutiliza las referencias a los objetos internos de la colección original.
Una copia superficial de registros de estudiantes sigue compartiendo cada diccionario de estudiante, así que cambiar una edad afecta a ambas.
Counter
Un Counter es un tipo de diccionario de la biblioteca estándar para contar elementos aptos para hash, que devuelve cero al consultar un elemento ausente.
Un Counter construido a partir de "level" registra dos apariciones de "l", dos de "e" y una de "v".

D

Desempaquetado de tuplas
El desempaquetado de tuplas asigna los elementos de una tupla a nombres separados, como la clave y el valor recibidos de un elemento de diccionario.
El desempaquetado de tuplas en for name, score in scores.items(): hace que ambas partes estén disponibles en el cuerpo del bucle.
Diccionario
Un diccionario es una colección mutable que asocia claves únicas aptas para hash a valores y conserva el orden en que se insertaron las claves.
Un diccionario puede asociar cada nombre de producto a su cantidad actual, como en {"tape": 8, "glue": 3}.
Diccionario anidado
Un diccionario anidado contiene otro diccionario como valor, lo que permite que las claves externas identifiquen registros y las internas identifiquen campos.
Un diccionario anidado de estudiantes permite que students["ana"]["major"] lea un campo del registro de Ana.
Diccionario con valores predeterminados (defaultdict)
Un diccionario con valores predeterminados es un tipo de diccionario que crea y almacena un valor mediante una función de creación proporcionada cuando se lee una clave ausente con corchetes.
Un defaultdict creado con list inicia una lista vacía independiente cada vez que se lee por primera vez una clave de grupo nueva.
Diccionario por comprensión
Un diccionario por comprensión construye un diccionario nuevo produciendo pares clave-valor a partir de un iterable, con la opción de filtrar las entradas.
El diccionario por comprensión {word: len(word) for word in words} almacena una longitud bajo cada palabra.
Diferencia
La diferencia a - b contiene los miembros del conjunto izquierdo que no están en el derecho, por lo que el orden de los operandos importa.
La diferencia required - skills encuentra los requisitos que le faltan a la persona candidata, no sus competencias adicionales.
Diferencia simétrica
La diferencia simétrica contiene los elementos que están en exactamente uno de dos conjuntos y elimina los miembros compartidos de su pertenencia combinada.
La diferencia simétrica de dos listas de miembros de clubes contiene a quienes se unieron a un club, pero no a ambos.

E

Elemento
Un elemento es un miembro de un conjunto; los valores iguales cuentan como el mismo miembro aunque se hayan proporcionado más de una vez.
El elemento 3 aparece una vez en set([3, 3, 5]), así que el conjunto resultante solo tiene dos miembros.
Eliminación de duplicados
La eliminación de duplicados quita las apariciones repetidas y deja un representante de cada valor distinto; el orden solo se conserva si se usa un método adecuado.
La eliminación de duplicados con list(dict.fromkeys(items)) conserva los elementos aptos para hash en su orden de primera aparición.

F

Filtro
Un filtro conserva solo las entradas que cumplen una condición; la cláusula if final de una comprensión decide qué entradas producen pares.
Un filtro como if quantity > 0 excluye los productos con existencias cero al construir un diccionario nuevo.
Función de creación de valores predeterminados
Una función de creación de valores predeterminados es la función a la que un defaultdict llama sin argumentos para crear un valor al consultar una clave ausente.
La función de creación de valores predeterminados list crea una lista vacía nueva para cada clave nueva de defaultdict(list).
Función zip
La función zip empareja los elementos correspondientes de sus entradas y se detiene cuando la entrada más corta no tiene más elementos.
Usar zip para emparejar nombres y puntuaciones omite los nombres sin pareja cuando la lista de puntuaciones es más corta.
Fusión de diccionarios
Una fusión de diccionarios combina pares en un resultado; con a | b, las claves compartidas toman sus valores de b y ambas entradas permanecen sin cambios.
La fusión defaults | overrides permite que un valor de sustitución reemplace al predeterminado para la misma configuración.

I

Igualdad de colecciones
La igualdad de colecciones compara el contenido según el tipo de colección: las listas requieren el mismo orden, mientras que los diccionarios y los conjuntos ignoran el orden.
La igualdad de colecciones hace que {"a": 1, "b": 2} sea igual a los mismos pares insertados en el orden opuesto.
Informe con formato
Un informe con formato presenta datos seleccionados en una salida legible, como una línea por registro con una media mostrada con una cifra decimal.
Un informe con formato puede usar f"{name}: {average:.1f}" para mostrar un identificador y su media redondeada.
Inicialización
La inicialización da a una variable su valor inicial antes del procesamiento, como un diccionario vacío antes de un bucle de conteo.
Inicializar con counts = {} dentro del bucle borraría los conteos reunidos en las iteraciones anteriores.
Intersección
La intersección de dos conjuntos contiene solo los elementos presentes en ambos y excluye los miembros que aparecen en una sola entrada.
La intersección de los identificadores de personas inscritas y los de quienes han pagado identifica a las personas que pertenecen a ambos grupos.
Intersección de vistas de claves
Una intersección de vistas de claves aplica & a vistas de claves de diccionario y devuelve las claves presentes en ambos diccionarios sin comparar sus valores.
Una intersección de vistas de claves de los diccionarios de existencias de dos tiendas encuentra los productos que venden ambas tiendas, aunque sus cantidades de existencias sean distintas.
Inversión de claves y valores
La inversión de claves y valores de un diccionario intercambia sus claves y valores; necesita valores aptos para hash, y los valores repetidos se reducen a una sola clave nueva.
La inversión de dos nombres con el mismo color favorito conserva solo el último nombre bajo ese color.
Iteración
La iteración visita los elementos proporcionados por una colección, uno por cada paso del bucle; iterar directamente sobre un diccionario proporciona sus claves.
La iteración sobre {"west": 4, "east": 9} visita "west" y después "east", no las cantidades almacenadas.

K

KeyError
Un KeyError es una excepción que se lanza al consultar una clave de diccionario ausente o al realizar ciertas operaciones de eliminación sobre claves o elementos ausentes.
La expresión stock["soap"] lanza KeyError si no existe una entrada de jabón en el diccionario de existencias.

L

Lista
Una lista es una secuencia mutable y ordenada que permite valores repetidos y permite acceder a los elementos por sus posiciones.
Una lista de préstamos conserva el mismo identificador de libro dos veces cuando el libro se presta dos veces en un día.

M

Método discard
El método de conjuntos discard elimina un elemento indicado cuando está presente y deja el conjunto sin cambios cuando el elemento no existe.
Llamar a discard con blocked.discard(address) permite que una dirección ya esté desbloqueada sin provocar un error.
Método pop
El método de diccionario pop elimina una clave indicada y devuelve su valor almacenado; si la clave no existe, usa el valor predeterminado proporcionado.
Una llamada a inventory.pop("pads") usa pop para recuperar la cantidad anterior mientras elimina ese producto.
Método popitem
El método de diccionario popitem elimina y devuelve el último par clave-valor insertado como una tupla de dos elementos.
Después de añadir las claves "a" y luego "b", popitem() devuelve el par de "b", aunque su valor sea menor.
Método setdefault
El método de diccionario setdefault devuelve un valor existente o, si su clave no existe, primero inserta un valor predeterminado y lo devuelve.
Agrupar con setdefault crea una lista para una categoría nueva y conserva la lista de una categoría existente.
Mutación
Una mutación modifica un objeto existente, por ejemplo al añadir un par de diccionario o sustituir su valor, sin crear un objeto que lo reemplace.
La asignación stock["soap"] = 6 es una mutación visible mediante cualquier otro nombre de ese diccionario.

N

Normalización de texto
La normalización de texto uniformiza ciertas diferencias antes del procesamiento, como convertir las palabras a minúsculas para que el uso de mayúsculas no separe sus conteos.
La normalización de texto puede hacer que "Map" y "map" compartan una clave de conteo de palabras al convertir ambas a minúsculas.
Número de valores distintos
El número de valores distintos mide cuántos valores diferentes aparecen y se obtiene con len(set(items)) cuando los elementos de entrada son aptos para hash.
El número de valores distintos de [7, 7, 2, 7] es dos, mientras que su número total de apariciones es cuatro.

O

Orden de inserción
El orden de inserción es el orden en que se añadieron las claves de un diccionario, que se conserva al iterar sobre él o mostrarlo.
En el orden de inserción, "west" permanece antes de "east" si se añadió primero, aunque cambie su valor.

P

Par clave-valor
Un par clave-valor es un elemento de diccionario formado por una clave única y su valor asociado; los dos puntos los unen en un literal.
El par clave-valor "room": 12 asocia el nombre de campo "room" al número 12.

R

Registro
Un registro almacena campos relacionados sobre una entidad, a menudo como un diccionario cuyas claves nombran campos como la edad, la especialidad o las puntuaciones.
El registro de un dispositivo puede contener su modelo como cadena y sus puertos disponibles como lista.

S

Subconjunto
Un subconjunto tiene todos sus elementos contenidos en otro conjunto; la comprobación <= permite que los dos conjuntos sean iguales.
La comprobación de subconjunto required <= skills solo se cumple cuando la persona candidata tiene todas las competencias requeridas.
Subconjunto propio
Un subconjunto propio es un subconjunto que no es igual al conjunto que lo contiene, el cual debe tener al menos un elemento adicional.
La comprobación de subconjunto propio {2} < {2, 4} es verdadera, mientras que {2} < {2} es falsa porque los conjuntos son iguales.
Superconjunto
Un superconjunto contiene todos los elementos de otro conjunto; a >= b comprueba si a contiene todos los miembros de b y permite la igualdad.
La comprobación de superconjunto skills >= required verifica si la persona candidata tiene todas las competencias requeridas.

T

Tabla de frecuencias
Una tabla de frecuencias asocia cada elemento distinto a su número de apariciones, a menudo mediante un diccionario con conteos enteros como valores.
Una tabla de frecuencias de los lanzamientos [2, 5, 2] almacena un conteo de dos bajo 2 y de uno bajo 5.
Total por categoría
Un total por categoría es la suma de los importes asignados a una etiqueta, que se construye sumando cada importe nuevo al total anterior de esa etiqueta.
Un total por categoría de alimentación suma todos los gastos de alimentación, aunque entre ellos aparezcan gastos de viajes.
Tupla
Una tupla es una colección ordenada con posiciones fijas; sus elementos no se pueden sustituir, aunque un objeto mutable que contenga sí puede cambiar.
Una tupla como ("Dune", 1965) mantiene juntos un título y su año de publicación como un par.

U

Unión
La unión de dos conjuntos contiene todos los elementos presentes en cualquiera de los conjuntos o en ambos, con cada elemento igual una sola vez.
La unión morning | evening reúne a todas las personas que asisten a cualquiera de las sesiones, incluidas las que asisten a ambas.

V

Valor
Un valor de diccionario es el objeto almacenado bajo una clave y puede ser un número, una cadena, una lista, un diccionario o cualquier otro tipo.
El valor bajo "scores" puede ser una lista, lo que permite que un registro contenga todas las puntuaciones de un estudiante.
Valor mutable compartido
Un valor mutable compartido es un objeto modificable almacenado o nombrado en varios lugares, de modo que una modificación mediante una referencia aparece mediante las demás.
Se obtiene un valor mutable compartido cuando dict.fromkeys(keys, []) coloca una lista bajo todas las claves de grupo.
Valor predeterminado (por defecto)
Un valor predeterminado es una alternativa que se proporciona para una consulta ausente, como el segundo argumento del método get de un diccionario.
En stock.get("soap", 0), el valor predeterminado es cero; la llamada no crea una entrada de jabón.
Vista de diccionario
Una vista de diccionario es un objeto dinámico devuelto por keys(), values() o items() que refleja los cambios del diccionario.
Una vista de diccionario guardada a partir de stock.keys() muestra un producto nuevo después de añadirlo.
Vista de pares clave-valor (items)
La vista de pares clave-valor proporciona las entradas de diccionario como tuplas de clave y valor, para que un bucle pueda recibir ambas partes de cada par almacenado.
La vista de pares clave-valor en for city, temp in temps.items(): proporciona cada ciudad junto con su temperatura.

Sobre esta unidad

Por StudeliInformar de un error

Crea tus propios Materiales de Estudio

Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.

Comenzar