▷ Python Quiz 3 - Modificación de elementos de diccionarios iterando en Python - El Pythonista

Python Quiz 3 – Modificación de elementos de diccionarios iterando en Python

PyQuiz 3 - modificando diccionario mientras se itera

Pregunta principal del pyquiz:

>>> dd = dict(color='Red', brand='Too')
>>> lst = []
>>> for d in dd:
...     lst.append(d)
...     del dd[d]
...
>>> print(lst)
- ?? -
# A - 21
# B - 9
# C - RuntimeError

Concepto y explicación

Esta pregunta es similar al PyQuiz 2, donde se modificaban los elementos de una lista mientras se estaba iterando sobre la misma, pero en este caso se hace sobre un diccionario y es totalmente diferente.

Mientras que la modificación de elementos sobre la lista sí que está permitida y provoca un efecto colateral difícil de detectar, cuando se hace sobre diccionarios, la modificación se detecta en tiempo de ejecución y se para la misma elevando una excepción RuntimeError.

Pero veamos en profundidad la lógica tras este ejemplo cómo se puede solventar esta situación:

  • Se pretende listar las claves del diccionario.
  • Se intenta eliminar los elementos del diccionario usando las claves del mismo.

Al ejecutar este código esta es el resultado:

>>> dd = dict(color='Red', brand='Too')
>>> lst = []
>>> for d in dd:
...     lst.append(d)
...     del dd[d]
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

El error que se eleva es muy explicito RuntimeError: dictionary changed size during iteration y deja claro el problema, pero ¿cómo se podría evitar este problema?

Algunas soluciones válidas para permitir la ejecución sin errores:

  • Borrar el diccionario tras iterar: esta solución es la más simple pero no serviría si existe alguna condición que hace que se deba de borrar solo algunas claves y otras no. Pero es la más razonable para el ejemplo.
>>> for d in dd:
...    lst.append(d)
...
>>> dd.clear()
  • Copiar el diccionario en uno nuevo: esta solución no sería muy buena dado que si se pretende eliminar el primero, no tiene mucho sentido crear una copia, pero es aceptable.
>>> d2 = dd.copy()
>>> for d in d2:
...    lst.append(d)
...    del dd[d]
...
>>> print(lst)
['color', 'brand']
  • Crear una copia de las claves de diccionarios: es la menos intrusiva y la solución recomendable en este caso.
>>> dd = dict(color='Red', brand='Too')
>>> lst = []
>>> for d in list(dd):
...     lst.append(d)
...     del dd[d]
...
>>> print(lst)
['color', 'brand']

Solución

Por tanto la solución correcta es la C, dado que la modificación de elementos en un diccionario cuando se está haciendo uso del mismo no está permitida en Python.

B) RuntimeError


Practica Python con PyQuizzes

En la sección de PyQuizzes puedes encontrar ejercicios prácticos explicados pormenorizado para mejorar tus habilidades como pythonista. ¡No te los pierdas!


📥 Llévate el cheatsheet de Python (gratis)

PDF de 6 páginas con lo esencial: tipos, condicionales, bucles, estructuras de datos, funciones y los errores que más vas a cometer. Para tener al lado mientras programas.

Sin spam. Te apuntas a la lista, descargas el cheatsheet y recibes contenido de Python cada semana.

Tutorial Python online

Aprender Python de forma gratuita siguiendo las secciones del tutorial de Python.


Libros recomendados para aprender Python

Estos son los libros que pueden ayudarte a aprender Python, aprender a programar, tipos de datos, algoritmia y mucho más.

Libro Python a fondo Disponible en:

¿Quieres aprender Python en orden, no a saltos?

Esto que has leído es solo una pieza. En El Pythonista lo verás todo encadenado: 11 módulos, 35+ lecciones, código revisado, ejercicios y un proyecto real (MovieTracker) que crece contigo desde la primera variable hasta el deploy a producción.

Ver el curso completo →

35+ lecciones · Proyecto real · Acceso de por vida · 14 días de garantía

Compartir

1 respuesta

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicar un comentario