Python - Mapas

Python Maps, también llamado ChainMap, es un tipo de estructura de datos para administrar varios diccionarios juntos como una sola unidad. El diccionario combinado contiene los pares de clave y valor en una secuencia específica eliminando cualquier clave duplicada. El mejor uso de ChainMap es buscar en varios diccionarios a la vez y obtener el mapeo de pares clave-valor adecuado. También vemos que estos ChainMaps se comportan como una estructura de datos de pila.

Crear un ChainMap

Creamos dos diccionarios y los agrupamos usando el método ChainMap de la biblioteca de colecciones. Luego imprimimos las claves y valores del resultado de la combinación de los diccionarios. Si hay claves duplicadas, solo se conserva el valor de la primera clave.

import collections

dict1 = {'day1': 'Mon', 'day2': 'Tue'}
dict2 = {'day3': 'Wed', 'day1': 'Thu'}

res = collections.ChainMap(dict1, dict2)

# Creating a single dictionary
print(res.maps,'\n')

print('Keys = {}'.format(list(res.keys())))
print('Values = {}'.format(list(res.values())))
print()

# Print all the elements from the result
print('elements:')
for key, val in res.items():
    print('{} = {}'.format(key, val))
print()

# Find a specific value in the result
print('day3 in res: {}'.format(('day1' in res)))
print('day4 in res: {}'.format(('day4' in res)))

Cuando se ejecuta el código anterior, produce el siguiente resultado.

[{'day1': 'Mon', 'day2': 'Tue'}, {'day1': 'Thu', 'day3': 'Wed'}] 

Keys = ['day1', 'day3', 'day2']
Values = ['Mon', 'Wed', 'Tue']

elements:
day1 = Mon
day3 = Wed
day2 = Tue

day3 in res: True
day4 in res: False

Reordenamiento del mapa

Si cambiamos el orden de los diccionarios mientras los golpeamos en el ejemplo anterior, vemos que la posición de los elementos se intercambia como si estuvieran en una cadena continua. Esto nuevamente muestra el comportamiento de Maps como pilas.

import collections

dict1 = {'day1': 'Mon', 'day2': 'Tue'}
dict2 = {'day3': 'Wed', 'day4': 'Thu'}

res1 = collections.ChainMap(dict1, dict2)

print(res1.maps,'\n')

res2 = collections.ChainMap(dict2, dict1)

print(res2.maps,'\n')

Cuando se ejecuta el código anterior, produce el siguiente resultado.

[{'day1': 'Mon', 'day2': 'Tue'}, {'day3': 'Wed', 'day4': 'Thu'}] 

[{'day3': 'Wed', 'day4': 'Thu'}, {'day1': 'Mon', 'day2': 'Tue'}]

Actualizar mapa

Cuando se actualiza el elemento del diccionario, el resultado se actualiza instantáneamente en el resultado del ChainMap. En el siguiente ejemplo, vemos que el nuevo valor actualizado se refleja en el resultado sin aplicar explícitamente el método ChainMap nuevamente.

import collections

dict1 = {'day1': 'Mon', 'day2': 'Tue'}
dict2 = {'day3': 'Wed', 'day4': 'Thu'}

res = collections.ChainMap(dict1, dict2)

print(res.maps,'\n')

dict2['day4'] = 'Fri'

print(res.maps,'\n')

Cuando se ejecuta el código anterior, produce el siguiente resultado.

[{'day1': 'Mon', 'day2': 'Tue'}, {'day3': 'Wed', 'day4': 'Thu'}] 

[{'day1': 'Mon', 'day2': 'Tue'}, {'day3': 'Wed', 'day4': 'Fri'}]