Dados dos diccionarios, la tarea es combinar los diccionarios de modo que obtengamos los valores agregados para las claves comunes en el diccionario resultante.
Ejemplo:
Input: dict1 = {'a': 12, 'for': 25, 'c': 9} dict2 = {'Geeks': 100, 'geek': 200, 'for': 300} Output: {'for': 325, 'Geeks': 100, 'geek': 200}
Veamos algunos de los métodos para realizar la tarea.
Método #1: método ingenuo
Python3
# Python program to combine two dictionary # adding values for common keys # initializing two dictionaries dict1 = {'a': 12, 'for': 25, 'c': 9} dict2 = {'Geeks': 100, 'geek': 200, 'for': 300} # adding the values with common key for key in dict2: if key in dict1: dict2[key] = dict2[key] + dict1[key] else: pass print(dict2)
Producción:
{'for': 325, 'Geeks': 100, 'geek': 200}
Método #2: Usar colecciones.Contador()
Python3
# Python program to combine two dictionary # adding values for common keys from collections import Counter # initializing two dictionaries dict1 = {'a': 12, 'for': 25, 'c': 9} dict2 = {'Geeks': 100, 'geek': 200, 'for': 300} # adding the values with common key Cdict = Counter(dict1) + Counter(dict2) print(Cdict)
Producción:
Counter({'for': 325, 'geek': 200, 'Geeks': 100, 'a': 12, 'c': 9})
Método #3: Usar itertools.chain()
Python3
# Python program to combine two dictionary # adding values for common keys import itertools import collections # initializing two dictionaries dict1 = {'a': 12, 'for': 25, 'c': 9} dict2 = {'Geeks': 100, 'geek': 200, 'for': 300} # using defaultdict Cdict = collections.defaultdict(int) # iterating key, val with chain() for key, val in itertools.chain(dict1.items(), dict2.items()): Cdict[key] += val print(dict(Cdict))
Producción:
{'for': 325, 'a': 12, 'geek': 200, 'Geeks': 100, 'c': 9}
Método #4: Usar functools.reduce y dictar comprensión
Python3
#Here is another way to combine dictionaies and #sum values of common keys (runs fast): from functools import reduce # creating three dictionaries in a list dict_seq = [ {'a': 1, 'b': 2, 'c': 3}, {'a':10, 'b': 20}, {'b': 100}, ] print(reduce(lambda d1,d2: {k: d1.get(k,0)+d2.get(k,0) for k in set(d1)|set(d2)}, dict_seq))
Producción:
{'a': 11, 'b': 122, 'c': 3}