Python Quiz 4 – Actualización rápida de diccionarios en Python

PyQuiz 4 - Actualización rápida de diccionarios

Pregunta principal del pyquiz:

>>> a = dict(color='Blue', num=4)
>>> b = dict(color='Red', wheel=8)
>>> print(lst)
- ?? -
# A - {'color': 'Red', 'num': 4, 'wheel': 8}
# B - SyntaxError
# C - {'color': 'RedBlue'}

Concepto y explicación

La idea principal de esta encuesta es conocer las diferentes herramientas que ofrece Python para actualizar diccionarios. Desde Python 2 se permite hacer una actualización de diccionarios utilizando el método update, pero en Python 3 se introdujo un cambio de sintaxis que permite hacer las actualizaciones de manera elegante.

La sintáxis de las actualizaciones hace uso de la descomposición de argumentos por clave valor y la creación de diccionarios, y se puede representar de la siguiente forma:

'{' '**' <dict>[, '**'<dict>]'}'

Esa sería una definición formal pero veamos en profundidad la lógica detrás de este pyquiz:

  • Se inicializan 2 diccionarios usando el constructor de clase.
  • Ambos diccionarios comparten la clave color.
  • Se construye un nuevo diccionario como la unión de ambos diccionarios.

Esta lógica se podría representar de forma iterativa como sigue:

>>> a = dict(color='Blue', num=4)
>>> b = dict(color='Red', wheel=8)
>>> c = a.copy()
>>> for b_key, b_value in b.items():
...     c[b_key] = b_value
...
>>> print(c)
{'color': 'Red', 'num': 4, 'wheel': 8}

Como se puede ver en esta versión, el resultado correcto es A, pero analicemos qué ocurre con el código de la pregunta.

Cuando se utiliza la descomposición de argumentos se obtiene un iterador en forma de pares clave valor:

>>> a = dict(color='Blue', num=4)
>>> b = dict(color='Red', wheel=8)
>>> def echo(**kwargs):
...     print(kwargs)
...
>>> echo(**a)
{'color': 'Blue', 'num': 4}
>>> echo(**b)
{'color': 'Red', 'wheel': 8}

Como se puede ver en el ejemplo, una función no acepta que se pasen claves duplicadas pero cuando se usan diccionarios no existe este problema, dado que prevalecerá el valor de la última ocurrencia de la clave.

Por otro lado, un diccionario se puede crear un diccionario a partir de sus kwargs (pares clave valor), por lo que si se unen ambos conceptos se obtiene la siguiente inicialización:

>>> dict({'color':'Blue', 'num': 4, 'color': 'Red', 'wheel': 8})
{'color': 'Red', 'num': 4, 'wheel': 8}

Por último lo que queda es unir los dos conceptos y añadir un poco de «azucar sintáctico» para permitir usar este concepto con la inicialización de diccionarios en forma literal:

>>> {**a, **b}
{'color': 'Red', 'num': 4, 'wheel': 8}

>>> c = {**a, **b}
>>> id(c)
4567979328
>>> id(a)
4567978432
>>> id(b)
4567978816

Cabe mencionar varios aspectos:

  • El nuevo diccionario es un nuevo objeto (como se ve en el ejemplo al tener diferente id).
  • El orden de los diccionarios importa, dado que en caso de colisión de claves (como en color), prevalecen los valores del último diccionario.
  • En esta forma se pueden concatenar n diccionarios.
>>> a = dict(color='Blue', num=4)
>>> b = dict(color='Red', wheel=8)
>>> d = {'nombre': 'Juan', 'edad': 45}
>>> e = dict(pelo='canoso', color_pelo='blanco')
>>> {**a, **b, **d, **e}
{'color': 'Red', 'num': 4, 'wheel': 8, 'nombre': 'Juan', 'edad': 45, 'pelo': 'canoso', 'color_pelo': 'blanco'}

Solución

Por tanto la solución correcta es la A.

A) {‘color’: ‘Red’, ‘num’: 4, ‘wheel’: 8}

Observación: en este caso la respuesta B) SyntaxError, sería correcta si se utiliza Python 2, dado que esta sintaxis no está soportada en esa versión del lenguaje.


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

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