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

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.
1 respuesta