Unir diccionarios en Python

¿Cómo unir dos o más diccionarios en Python?

Para unir diccionarios en Python, podemos combinar el método << chain >> de la librería << itertools >> y << defaultdict >> de la libreria << collections >>. Ello nos va a permitir operar con los valores almacenados dentro de un diccionario de Python.

Gracias a esta función pueden unirse los valores anidados en los diccionarios de Python, de modo que podamos almacenar y operar sus valores.

Por ejemplo, pensemos en un proveedor que a diario abastece de alimentos a un restaurante. Cada día de la semana contara con una lista de alimentos que tiene que proveer o que ha proveido y puede que al final de la semana necesite verificar el conjunto de elementos que ha abastecido y en qué cantidad.

Python for loop
Un diccionario con esta estructura podría permitir al proveedor anotar lo que sirve cada día de la semana.

Observemos el código completo de los 5 diccionarios de la semana, cada día de la semana anota los elementos que ha servido y los anota como llaves y la cantidad la anota como su valor parejo aprovechando la estructura key, value de los diccionarios de Python:

from itertools import chain
from collections import defaultdict

lista_lunes = {
    'manzanas': 1,
    'naranjas': 2,
    'kiwis': 2,
    'salmón': 0.5,
    'berenjena': 5,
    'guisantes': 0.5    
    }


lista_martes = {
    'manzanas': 1,
    'naranjas': 0.5, 
    'salmón': 1, 
    'guisantes': 2, 
    'alcachofas': 1.5, 
    }

lista_miercoles = {
    'manzanas': 1,
    'naranjas': 0.5, 
    'salmón': 1, 
    'guisantes': 2, 
    'alcachofas': 1.5, 
    }

lista_jueves = {
    'manzanas': 1,
    'bonito': 5, 
    'calamares': 1, 
    'membrillos': 1, 
    'pimientos': 1.8, 
    }

lista_viernes = {
    'manzanas': 1,
    'coles': 2.5, 
    'berenjenas': 1, 
    'calamares': 1, 
    'huevos': 2, 
    }

A continuación construimos la lista_def del tipo << defaultdict >> que va a permitir al proveedor calcular el conjunto de entregas.

lista_def = defaultdict(list)

for keys, values in chain(lista_lunes.items(), lista_martes.items(), lista_miercoles.items(),lista_jueves.items(), lista_viernes.items()):
    lista_def[keys].append(values) # lista_def actua como contenedor de una lista por cada llave.

Bucle for sobre una lista

Para poder observar el elemento lista_def elaborado podemos hacer un bucle for sobre el mismo, como si se tratase de un diccionario habitual:

for keys,values in lista_def.items():
    print(keys,values)

Obteniendo la siguiente salida de datos:

Python loop
El bucle for ha permitido listar cada uno de los elementos servidos y la cantidad que se ha solicitado por cada día de la semana

Podemos utilizar otro bucle for que opere los elementos dando lugar a la cantidad conjunta servida en la semana:

for loop Python
Bucle que extrae la llave de la lista_def aplicandole el método title como string que es y la suma de los valores almacenados independientemente de su número

Obteniendo la siguiente salida de datos en Anaconda Spyder:

for loop python dict
El bucle for extrae ahora la llave o artículo y el sumatorio de los valores anidados en cada llave

A continuación, todo el código del ejercicio:

# -*- coding: utf-8 -*-
"""
Created on Sun Oct  3 11:09:14 2021

@author: ruizg
"""
from itertools import chain
from collections import defaultdict

lista_lunes = {
    'manzanas': 1,
    'naranjas': 2,
    'kiwis': 2,
    'salmón': 0.5,
    'berenjena': 5,
    'guisantes': 0.5    
    }


lista_martes = {
    'manzanas': 1,
    'naranjas': 0.5, 
    'salmón': 1, 
    'guisantes': 2, 
    'alcachofas': 1.5, 
    }

lista_miercoles = {
    'manzanas': 1,
    'naranjas': 0.5, 
    'salmón': 1, 
    'guisantes': 2, 
    'alcachofas': 1.5, 
    }

lista_jueves = {
    'manzanas': 1,
    'bonito': 5, 
    'calamares': 1, 
    'membrillos': 1, 
    'pimientos': 1.8, 
    }

lista_viernes = {
    'manzanas': 1,
    'coles': 2.5, 
    'berenjenas': 1, 
    'calamares': 1, 
    'huevos': 2, 
    }

lista_def = defaultdict(list)

for keys, values in chain(lista_lunes.items(), lista_martes.items(), lista_miercoles.items(),lista_jueves.items(), lista_viernes.items()):
    lista_def[keys].append(values)
    
for keys,values in lista_def.items():
    print(keys,values)

for keys,values in lista_def.items():
    print(f"{keys.title()} -> {sum(values)} kilogramos")

Así pues, operar con los datos almacenados en un diccionario en posible gracias a este procedimiento en Python. Almacenamos elementos con su valor, y después podemos unirlos manteniendo la llave y operando e iterando. Magnífico, porque podemos salvar cualquier cardinalidad con bucles anidados.

Si quieres saber más sobre el bucle for -> Bucle for en Python

Saber más sobre los diccionarios en Python -> Diccionarios en Python

También puedes ampliar información en GeeksforGeeks.org -> diccionarios Python

Más sobre default.dict -> default.dict

Autor: ignacio

Profesor de Sistemas de Gestión de Información

Deja una respuesta

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