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!


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.

Disponible en:

Compartir

1 respuesta

Deja una respuesta

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

Ver más

  • Responsable: Oscar Ramirez.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento: No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a ionos (1&1) que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Publicar un comentario